2017-04-24 4 views
0

Je suis nouveau sur Xcode et j'essaye de faire une application et j'aimerais bouger le clavier lorsque j'écris dans le champ de texte, mais la vue ne bouge pas et je n'ai aucune idée de comment la réparer. Pourquoi et comment puis-je le réparer? swift 3 IOS8
Merci!Le clavier ne se déplace pas lorsque je veux écrire dans le champ de texte. Comment devrais-je le réparer? sweift 3 IOS8

Voici mon code:

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() 
    }) 
}  
} 

Répondre

0

Si vous utilisez l'application Simulator sur le Mac, le clavier utilisé par défaut est le clavier Mac donc il ne sera pas l'afficher sur l'écran. Pour le montrer vous devez aller dans le simulateur à Hardware > Keyboard > Toggle Software Keyboard ou ⌘K pour la simplicité.

+0

Non, je suis en train de tester sur mon mobile! Merci pour la réponse! – nasamo