delegate ios swift textfield

ios - delegate - enfocando un campo de texto en veloz



uitextfield (2)

Esto funciona para mí:

import UIKit class ViewController:UIViewController, UITextFieldDelegate { @IBOutlet weak var fNameField: UITextField! @IBOutlet weak var sNameField: UITextField! @IBOutlet weak var emailField: UITextField! @IBOutlet weak var passwordField: UITextField! override func viewDidLoad() { super.viewDidLoad() fNameField.delegate = self sNameField.delegate = self emailField.delegate = self passwordField.delegate = self } func isValidEmail (test:String) ->Bool{ // your email validation here... return true } func textFieldShouldReturn(textField: UITextField) -> Bool { textField.resignFirstResponder() if (textField == self.fNameField) { self.sNameField.becomeFirstResponder() } else if (textField == self.sNameField) { self.emailField.becomeFirstResponder() } else if (textField == self.emailField) { self.passwordField.becomeFirstResponder() } else{ var thereWereErrors = checkForErrors() if !thereWereErrors { //conditionally segue to next screen } } return true } func checkForErrors() -> Bool { var errors = false let title = "Error" var message = "" if fNameField.text.isEmpty { errors = true message += "First name empty" alertWithTitle(title, message: message, ViewController: self, toFocus:self.fNameField) } else if sNameField.text.isEmpty { errors = true message += "Surname empty" alertWithTitle(title, message: message, ViewController: self, toFocus:self.sNameField) self.sNameField.becomeFirstResponder() } else if emailField.text.isEmpty { errors = true message += "Email empty" alertWithTitle(title, message: message, ViewController: self, toFocus:self.emailField) } else if !isValidEmail(emailField.text) { errors = true message += "Invalid Email Address" alertWithTitle(title, message: message, ViewController: self, toFocus:self.emailField) } else if passwordField.text.isEmpty { errors = true message += "Password empty" alertWithTitle(title, message: message, ViewController: self, toFocus:passwordField) } else if count(passwordField.text.utf16)<8 { errors = true message += "Password must be at least 8 characters" alertWithTitle(title, message: message, ViewController: self, toFocus:self.passwordField) } return errors } func alertWithTitle(title: String!, message: String, ViewController: UIViewController, toFocus:UITextField) { let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert) let action = UIAlertAction(title: "OK", style: UIAlertActionStyle.Cancel,handler: {_ in toFocus.becomeFirstResponder() }); alert.addAction(action) ViewController.presentViewController(alert, animated: true, completion:nil) } }

Tengo 4 campos de texto en una pantalla de registro y lo tengo configurado de modo que cuando el usuario presiona a continuación en cada campo de texto, el siguiente campo de texto esté enfocado. Código abajo:

func textFieldShouldReturn(textField: UITextField) -> Bool { if (textField == self.fNameField) { textField.resignFirstResponder() self.sNameField.becomeFirstResponder() } else if (textField == self.sNameField) { self.emailField.becomeFirstResponder() } else if (textField == self.emailField) { self.passwordField.becomeFirstResponder() } else{ var thereWereErrors = checkForErrors() if !thereWereErrors { //conditionally segue to next screen } } return true }

Al regresar el campo de texto final, estoy llamando a una función de verificación de errores (a continuación). Dentro de eso, si hay un problema con cualquier campo, quiero enfocar ese campo de texto para que el usuario pueda corregirlo fácilmente. Lo que está sucediendo es que el campo de texto con el error se está enfocando (según lo indican las funciones de checkForErrors) por un segundo, pero luego el foco está cambiando de nuevo al campo de texto de la contraseña. También intenté agregar self.passwordField.resignFirstResponder() en la última parte de la función anterior y eso hace que el campo de la contraseña pierda el foco, pero luego el campo de texto con el problema encontrado no está enfocándose en absoluto (ni siquiera por un segundo como antes) ¿Cómo puedo solucionar esto?

func checkForErrors() -> Bool { var errors = false let title = "Error" var message = "" if fNameField.text.isEmpty { errors = true message += "First name empty" alertWithTitle(title, message: message, ViewController: self) self.fNameField.becomeFirstResponder() } else if sNameField.text.isEmpty { errors = true message += "Surname empty" alertWithTitle(title, message: message, ViewController: self) self.sNameField.becomeFirstResponder() } else if emailField.text.isEmpty { errors = true message += "Email empty" alertWithTitle(title, message: message, ViewController: self) self.emailField.becomeFirstResponder() } else if !isValidEmail(emailField.text) { errors = true message += "Invalid Email Address" alertWithTitle(title, message: message, ViewController: self) self.emailField.becomeFirstResponder() } else if passwordField.text.isEmpty { errors = true message += "Password empty" alertWithTitle(title, message: message, ViewController: self) self.passwordField.becomeFirstResponder() } else if count(passwordField.text.utf16)<8 { errors = true message += "Password must be at least 8 characters" alertWithTitle(title, message: message, ViewController: self) self.passwordField.becomeFirstResponder() } return errors }

Nota he incluido el delegado textField.

alerta con función de título según lo solicitado:

func alertWithTitle(title: String!, #message: String, #ViewController: UIViewController) { let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert) let action = UIAlertAction(title: "OK", style: .Cancel, handler: nil) alert.addAction(action) ViewController.presentViewController(alert, animated: true, completion: nil) }


theTextFieldYouWant.becomeFirstResponder()