У меня есть 4 текстовых поля на экране регистра, и я настроил его так, что, когда пользователь нажимает рядом на каждое текстовое поле, фокусируется следующее текстовое поле. Код ниже:фокусировка текстового поля в 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
}
При возврате окончательного текстового поля я вызываю функцию проверки ошибок (см. Ниже). В этом случае, если есть проблема с любым полем, я хочу сфокусировать это текстовое поле, чтобы пользователь мог легко его исправить. Что происходит, так это то, что текстовое поле с ошибкой фокусируется (по указанию функций checkForErrors) на секунду, но затем фокус переключается обратно в текстовое поле пароля. Я также попытался добавить в self.passwordField.resignFirstResponder()
в последнюю оставшуюся часть вышеприведенной функции, и это заставляет поле пароля потерять фокус, но затем текстовое поле с обнаруженной проблемой не набирает фокус вообще (даже не на секунду, как раньше). Как я могу исправить это?
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
}
Примечание. Я включил делегат textField.
оповещения с функцией заголовка по запросу:
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)
}
что вы написали в textFieldDidBeginEditing? опубликуйте этот код – iAnurag
@iAnurag У меня нет textFieldDidBeginEditing на этом контроллере – user2363025
как вы управляете делегатами текстового поля? – iAnurag