Botón Siguiente / Hecho usando Swift con textFieldShouldReturn

Nuevo en Swift 🙂

Tengo un MainView que agrega una subvista (signUpWindow) cuando se presiona un button de logging.

En mi subconsulta signUpWindow (SignUpWindowView.swift), configuro cada campo con una function, como ejemplo:

func confirmPasswordText() { confirmPasswordTextField.frame=CGRectMake(50, 210, 410, 50) confirmPasswordTextField.placeholder=("Confirm Password") confirmPasswordTextField.textColor=textFieldFontColor confirmPasswordTextField.secureTextEntry=true confirmPasswordTextField.returnKeyType = .Next confirmPasswordTextField.clearButtonMode = .WhileEditing confirmPasswordTextField.tag=5 self.addSubview(confirmPasswordTextField) } 

Puedo hacer que el keyboard mueva con éxito el signUpWindow hacia arriba y hacia abajo cuando aparece y desaparece en MainView. Hurra 🙂

SignUpWindowView implementa UITextFieldDelegate

Mi problema es que estoy tratando de configurar el button Siguiente / Hecho en el keyboard y no estoy seguro de qué vista (MainView o SignUpWindowView) agregará la function textFieldShouldReturn . He intentado ambos, pero ni siquiera puedo hacer una printing para disparar para probar si la function está siendo ejecutada. Una vez que obtenga el textField ShouldReturn para disparar, estoy seguro de que puedo ejecutar el código necesario para que los botones Next / Done hagan lo que quiero, y publicará la solución final para include la function Next / Done.

ACTUALIZADO para include una versión abreviada de SignUpWindowView.swift

 import UIKit class SignUpWindowView: UIView,UITextFieldDelegate { let firstNameTextField:UITextField=UITextField() let lastNameTextField:UITextField=UITextField() override func drawRect(rect: CGRect){ func firstNameText(){ firstNameTextField.delegate=self firstNameTextField.frame=CGRectMake(50, 25, 200, 50) firstNameTextField.placeholder="First Name" firstNameTextField.returnKeyType = .Next self.addSubview(firstNameTextField) } func lastNameText(){ lastNameTextField.delegate=self lastNameTextField.frame=CGRectMake(260, 25, 200, 50) lastNameTextField.placeholder="Last Name" lastNameTextField.returnKeyType = .Done self.addSubview(lastNameTextField) } func textFieldShouldReturn(textField: UITextField!) -> Bool{ println("next button should work") if (textField === firstNameTextField) { firstNameTextField.resignFirstResponder() lastNameTextField.becomeFirstResponder() } return true } firstNameText() lastNameText() } 

UITextFieldDelegate implementar UITextFieldDelegate en su class y establecer ese object como delegado para UITextField . Luego implementa el método textFieldShouldReturn: así:

 func textFieldShouldReturn(textField: UITextField) -> Bool { textField.resignFirstResponder() if textField == someTextField { // Switch focus to other text field otherTextField.becomeFirstResponder() } return true } 

En su ejemplo, le falta esta línea:

 confirmPasswordTextField.delegate = self 

Si ha implementado el delegado, por supuesto.

Estaba intentando probar mis campos de text en SignUpWindowView.swift, que es donde se crean todos los campos de text. Pero, ya que coloco SignUpWindowView en mi MainViewController como una subvista, todo mi "handling" de UITextField necesitaba hacerse en MainView y NO en su subvista.

Así que aquí está mi código completo (en este momento) para mi MainViewController, que se encarga de mover mi SignUpWindowView hacia arriba / abajo cuando se muestra / oculta el keyboard y luego se mueve de un campo a otro. Cuando el usuario está en el último campo de text (cuyo button Siguiente del keyboard ahora está configurado en Listo en la subvista), el keyboard se retira y el usuario puede enviar el formulario con un button de logging.

MainViewController:

 import UIKit @objc protocol ViewControllerDelegate { func keyboardWillShowWithSize(size:CGSize, andDuration duration:NSTimeInterval) func keyboardWillHideWithSize(size:CGSize,andDuration duration:NSTimeInterval) } class ViewController: UIViewController,UITextFieldDelegate { var keyboardDelegate:ViewControllerDelegate? let signUpWindow=SignUpWindowView() let signUpWindowPosition:CGPoint=CGPointMake(505, 285) override func viewDidLoad() { super.viewDidLoad() // Keyboard Notifications NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil) NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil) // set the textFieldDelegates signUpWindow.firstNameTextField.delegate=self signUpWindow.lastNameTextField.delegate=self signUpWindow.userNameTextField.delegate=self signUpWindow.passwordTextField.delegate=self signUpWindow.confirmPasswordTextField.delegate=self signUpWindow.emailTextField.delegate=self } func keyboardWillShow(notification: NSNotification) { var info:NSDictionary = notification.userInfo! let keyboardFrame = info[UIKeyboardFrameEndUserInfoKey] as! NSValue let keyboardSize = keyboardFrame.CGRectValue().size var keyboardHeight:CGFloat = keyboardSize.height let animationDurationValue = info[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber var animationDuration : NSTimeInterval = animationDurationValue.doubleValue self.keyboardDelegate?.keyboardWillShowWithSize(keyboardSize, andDuration: animationDuration) // push up the signUpWindow UIView.animateWithDuration(animationDuration, delay: 0.25, options: UIViewAnimationOptions.CurveEaseInOut, animations: { self.signUpWindow.frame = CGRectMake(self.signUpWindowPosition.x, (self.signUpWindowPosition.y - keyboardHeight+140), self.signUpWindow.bounds.width, self.signUpWindow.bounds.height) }, completion: nil) } func keyboardWillHide(notification: NSNotification) { var info:NSDictionary = notification.userInfo! let keyboardFrame = info[UIKeyboardFrameEndUserInfoKey] as! NSValue let keyboardSize = keyboardFrame.CGRectValue().size var keyboardHeight:CGFloat = keyboardSize.height let animationDurationValue = info[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber var animationDuration : NSTimeInterval = animationDurationValue.doubleValue self.keyboardDelegate?.keyboardWillHideWithSize(keyboardSize, andDuration: animationDuration) // pull signUpWindow back to its original position UIView.animateWithDuration(animationDuration, delay: 0.25, options: UIViewAnimationOptions.CurveEaseInOut, animations: { self.signUpWindow.frame = CGRectMake(self.signUpWindowPosition.x, self.signUpWindowPosition.y, self.signUpWindow.bounds.width, self.signUpWindow.bounds.height) }, completion: nil) } func textFieldShouldReturn(textField: UITextField) -> Bool { switch textField { case signUpWindow.firstNameTextField: signUpWindow.lastNameTextField.becomeFirstResponder() break case signUpWindow.lastNameTextField: signUpWindow.userNameTextField.becomeFirstResponder() break case signUpWindow.userNameTextField: signUpWindow.passwordTextField.becomeFirstResponder() break case signUpWindow.passwordTextField: signUpWindow.confirmPasswordTextField.becomeFirstResponder() break case signUpWindow.confirmPasswordTextField: signUpWindow.emailTextField.becomeFirstResponder() break default: textField.resignFirstResponder() } return true } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } override func viewWillDisappear(animated: Bool) { NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil) NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil) } @IBAction func signup() { signUpWindow.frame=CGRectMake(signUpWindowPosition.x, signUpWindowPosition.y, 485,450) signUpWindow.backgroundColor=UIColor.clearColor() self.view.addSubview(signUpWindow) } } 

DidEndOnExit el DidEndOnExit (escribí esto desde la memory, así que tal vez no se llama exactamente pero similar) Evento UIControl usando una @IBAction y en esa function usa textF.resignFirstResponder() o .becomeFirstResponder()


EDITAR

UITextField es una subclass de UIControl y para agregar un nuevo evento de forma progtwigda, usa el método addTarget (). Ex:

 func a(sender: AnyObject) {} textField.addTarget(self, action: "a:", forControlEvents: .EditingDidEndOnExit) 

UIControl docs