Ho 4 campi di testo su una schermata di registro e l'ho impostato in modo che quando l'utente preme il prossimo campo di testo, il campo di testo successivo sia focalizzato. Codice seguente:mettere a fuoco un campo di testo in swift
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
}
Sulla restituzione del campo di testo finale, chiamo una funzione di controllo degli errori (sotto). All'interno di questo se c'è un problema con qualsiasi campo, voglio mettere a fuoco quel campo di testo in modo che l'utente possa facilmente correggerlo. Quello che sta succedendo è che il campo di testo con l'errore si sta concentrando (come indicato dalle funzioni checkForErrors) per un secondo, ma poi lo stato attivo sta tornando al campo di testo della password. Ho anche provato ad aggiungere in self.passwordField.resignFirstResponder()
l'ultimo altro della funzione sopra e che rende il campo della password perdere fuoco ma poi il campo di testo con il problema riscontrato non sta guadagnando il focus a tutti (nemmeno per un secondo come prima) Come posso risolvere Questo?
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 Ho incluso il delegato del campo di testo.
allarme con funzione di titolo come richiesto:
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)
}
quello che hai scritto in textFieldDidBeginEditing? inserisci il codice – iAnurag
@iAnurag Non ho un textFieldDidBeginEditing su questo controller – user2363025
come stai gestendo i tuoi delegati per i campi di testo? – iAnurag