Swift3 当我想在文本字段中写字时,键盘不会向上移动。我该怎么修?SWIFT 3 IOS8
我是Xcode新手,我正在尝试制作一个应用程序,当我在文本字段中写入时,我想移动键盘,但视图不移动,我不知道如何修复它。为什么以及如何修复它?swift 3 IOS8Swift3 当我想在文本字段中写字时,键盘不会向上移动。我该怎么修?SWIFT 3 IOS8,swift3,keyboard,xcode8,textfield,move,Swift3,Keyboard,Xcode8,Textfield,Move,我是Xcode新手,我正在尝试制作一个应用程序,当我在文本字段中写入时,我想移动键盘,但视图不移动,我不知道如何修复它。为什么以及如何修复它?swift 3 IOS8 谢谢大家! 这是我的密码: import UIKit class LoginController: UIViewController, UITextFieldDelegate { @IBOutlet weak var loginTextField: UITextField! @IBOutlet weak var topInfo
谢谢大家! 这是我的密码:
import UIKit
class LoginController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var loginTextField: UITextField!
@IBOutlet weak var topInfoLabel: UILabel!
@IBOutlet weak var uiHolderView: UIView!
@IBOutlet weak var emailTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!
@IBOutlet weak var loginButton: UIButton!
@IBOutlet weak var logo: UIImageView!
@IBOutlet weak var forgotPasswordButton: UIButton!
@IBOutlet weak var uiHolderViewCenterConstraint: NSLayoutConstraint!
@IBOutlet weak var loginBox: UIView!
fileprivate var isResettingPassword = false
fileprivate var keyboardIsShown = false
fileprivate var topUIHolderInitialValue : CGFloat?
fileprivate var uiHolderCenterInitialValue : CGFloat?
override func viewDidLoad() {
super.viewDidLoad()
loginTextField.isUserInteractionEnabled = false
loadUI()
DataManager.isCourseViewPresentedOnce = false
}
override func viewWillAppear(_ animated: Bool) {
let _token = DataManager.token?.token
if _token?.isEmpty == false {
print("will use old token")
if TokenManager.hasTokenExpired(){
CommunicationManager.renewToken({json -> Void in
TokenManager.saveRenewedToken(json)
self.navigateToUniversityController()
}, onFailure: {error -> Void in})
}else{
navigateToUniversityController()
}
}else{
print("no token")
}
registerForKeyboardNotifications()
emailTextField.delegate = self
passwordTextField.delegate = self
emailTextField.text = String()
passwordTextField.text = String()
uiHolderCenterInitialValue = uiHolderViewCenterConstraint.constant
}
fileprivate func navigateToUniversityController(){
DispatchQueue.main.async{
self.performSegue(withIdentifier: "segueToUniversityController", sender: self)
}
}
@IBAction func loginButtonClick(_ sender: AnyObject) {
if isResettingPassword == false {
login()
}else{
resetPassword()
}
}
@IBAction func forgotPasswordClicked(_ sender: AnyObject) {
if isResettingPassword == false{
showForgotPasswordAlert()
isResettingPassword = true
forgotPasswordButton.setTitle("Cancel", for: UIControlState())
passwordTextField.isUserInteractionEnabled = false
passwordTextField.isHidden = true
loginButton.setTitle("Send email", for: UIControlState())
emailTextField.returnKeyType = UIReturnKeyType.done
} else {
print("cancel clicked")
resetUIToInitialState()
}
}
func showForgotPasswordAlert(){
let alert = UIAlertController(title: "Forgot password", message: "Please provide your valid email. Reset link will be sent to your email address", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler:nil))
self.present(alert, animated: true, completion: nil)
}
fileprivate func resetUIToInitialState(){
isResettingPassword = false
forgotPasswordButton.setTitle("Forgot password", for: UIControlState())
passwordTextField.isUserInteractionEnabled = true
passwordTextField.layer.backgroundColor = UIColor.clear.cgColor
passwordTextField.isHidden = false
loginButton.setTitle("Login", for: UIControlState())
emailTextField.returnKeyType = UIReturnKeyType.next
topInfoLabel.text = "Login to play"
}
fileprivate func login(){
let email : String = emailTextField.text!
let password : String = passwordTextField.text!
if email != "" && password != "" {
CommunicationManager.login(email, password: password,
onSuccess: {json -> Void in
let token = Token()
token.token = json["token"].stringValue
token.tokenExpirationDate = TokenManager.decodePayloadReturnExpirationTime(json["token"].stringValue)
DataManager.token = token
self.performSegue(withIdentifier: "segueToUniversityController", sender: self)
},onFailure: { error -> Void in
let alert = UIAlertController(title: "TRY AGAIN", message:
"login failed", preferredStyle:UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler:nil))
self.present(alert, animated: true, completion: nil)
})
}else{
let alert = UIAlertController(title: "Try again", message: "email & password are required", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler:nil))
self.present(alert, animated: true, completion: nil)
}
}
fileprivate func resetPassword(){
let email : String = emailTextField.text!
if email != "" {
CommunicationManager.passwordRecovery(email,
onSuccess: {json -> Void in
self.showPasswordRecoverySuccess()
self.resetUIToInitialState()
},onFailure: { error -> Void in
let alert = UIAlertController(title: "Try again", message: "please provide valid email", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler:nil))
self.present(alert, animated: true, completion: nil)
})
}else{
let alert = UIAlertController(title: "Try again", message: "email is required", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler:nil))
self.present(alert, animated: true, completion: nil)
}
}
fileprivate func showPasswordRecoverySuccess(){
let alert = UIAlertController(title: "Password recovery", message: "password recovery link is sent to your email", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler:nil))
self.present(alert, animated: true, completion: nil)
}
func loadUI(){
topInfoLabel.text = "Login to play"
emailTextField.returnKeyType = UIReturnKeyType.next
passwordTextField.returnKeyType = UIReturnKeyType.done
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
func registerForKeyboardNotifications() {
NotificationCenter.default.addObserver(self, selector: #selector(LoginController.keyboardWillShowNotification(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(LoginController.keyboardWillHideNotification(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
//self.view.endEditing(true)
if textField == emailTextField{
if isResettingPassword == false{
passwordTextField.becomeFirstResponder()
}else{
self.view.endEditing(true)
}
}
if textField == passwordTextField{
self.view.endEditing(true)
}
return true
}
//MARK Private functions
func keyboardWillShowNotification(_ notification: Notification) {
print("keyboardWillShow")
if let userInfo = notification.userInfo {
if let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as? AnyObject)?.cgRectValue.size.height {
if keyboardIsShown == false {
uiHolderViewCenterConstraint.constant = uiHolderCenterInitialValue! - keyboardHeight
keyboardIsShown = true
}
UIView.animate(withDuration: 0.25, animations: { () -> Void in
self.view.layoutIfNeeded()
})
}
}
}
func keyboardWillHideNotification(_ notification: Notification) {
uiHolderViewCenterConstraint.constant = uiHolderCenterInitialValue!
keyboardIsShown = false
UIView.animate(withDuration: 0.25, animations: { () -> Void in
self.view.layoutIfNeeded()
})
}
}
如果您在Mac上使用模拟器应用程序,默认情况下使用的键盘是Mac键盘,因此不会在屏幕上显示。要显示它,您必须在模拟器中进入
硬件>键盘>切换软件键盘
或⌘K
为简单起见。不,我正在手机上测试!谢谢你的回答!