J'ai 4 champs de texte sur un écran de registre et je l'ai configuré de sorte que lorsque l'utilisateur appuie ensuite sur chaque champ de texte, le champ de texte suivant est activé. Code ci-dessous:
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
}
Au retour du champ de texte final, j'appelle une fonction de vérification des erreurs (ci-dessous). Dans ce cas, s'il y a un problème avec un champ, je souhaite concentrer ce champ de texte afin que l'utilisateur puisse le corriger facilement. Ce qui se passe, c'est que le champ de texte avec l'erreur se concentre (comme indiqué par les fonctions checkForErrors) pendant une seconde mais ensuite, le focus revient au champ de texte de mot de passe. J'ai aussi essayé d'ajouter self.passwordField.resignFirstResponder()
à la dernière fonction de la fonction ci-dessus, ce qui fait que le champ du mot de passe n'est plus actif. avant) Comment puis-je résoudre ce problème?
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
}
Remarque J'ai inclus le délégué textField.
alerte avec fonction titre à la demande:
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)
}
Cela fonctionne pour moi:
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)
}
}
theTextFieldYouWant.becomeFirstResponder()