Mam 4 pola tekstowe na ekranie rejestru i mam je skonfigurowane tak, że gdy użytkownik naciśnie następne pole tekstowe, następne pole tekstowe jest skupione. Kod poniżej:ogniskowanie pola tekstowego w szybkim tempie
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
}
Po powrocie z pola tekstowego końcowego, wzywam czek na funkcję błędów (poniżej). W tym przypadku, jeśli występuje problem z dowolnym polem, chcę skupić się na tym polu tekstowym, aby użytkownik mógł łatwo go poprawić. Dzieje się tak, że pole tekstowe z błędem ustawia ostrość (zgodnie z instrukcjami funkcji checkForErrors) przez sekundę, ale wtedy fokus przełącza się z powrotem do pola tekstowego hasła. Próbowałem również dodać w ostatnim ostatnim z powyższych funkcji self.passwordField.resignFirstResponder()
i to powoduje, że pole hasła traci ostrość, ale wtedy pole tekstowe z napotkanym problemem nie zyskuje w ogóle ostrości (nawet na sekundę, jak poprzednio). Jak mogę naprawić to?
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
}
Uwaga Uwzględniłem delegata textField.
alarm z funkcją tytułowego jako wniosek:
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)
}
co napisałeś w textFieldDidBeginEditing? po tym kodzie – iAnurag
@iAnurag Nie mam textFieldDidBeginEditing na tym kontrolerze – user2363025
jak zarządzasz swoimi delegatami pola tekstowego? – iAnurag