У меня есть контроллер представления под названием LoginViewController
, который соответствует UITextFieldDelegate
и имеет два текстовых поля объекты, а именно Email
и Password
. Там есть функция проверки электронной почты наложенная на текстовом поле Email
и если проверка не пройдена, экземпляр UIAlertController
будет удар вtextFieldShouldEndEditing метод делегата вызываются несколько раз на одном текстовом поле объекта, когда экземпляр UIAlertController выполняется
Вот скриншоты сцен и код, прежде чем я продолжу с моим вопросом:.
пс: Есть много печати заявление, чтобы позволить мне понять, поток выполнения
func textFieldShouldEndEditing(textField: UITextField) -> Bool {
guard self.validateEmail(self.emailTextField.text!) else {
print("self.presentedViewController: \(self.presentedViewController)")
if self.presentedViewController == nil {
let alertController = UIAlertController(title: "Invalid Email Address", message: "Please try again.", preferredStyle: UIAlertControllerStyle.Alert)
alertController.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
self.presentViewController(alertController, animated: true, completion: nil)
}
print("textFieldShouldEndEditing returnin false: \(textField.placeholder!) text field w/ value: \(textField.text!)")
return false
}
print("textFieldShouldEndEditing returning true: \(textField.placeholder!) text field w/ value: \(textField.text!)")
return true
}
func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
print("textFieldShouldBeginEditing: \(textField.placeholder!) text view")
return true
}
func textFieldDidEndEditing(textField: UITextField) {
print("textFieldDidEndEditing: \(textField.placeholder!) text field with value: \(textField.text!)")
}
func textFieldDidBeginEditing(textField: UITextField) {
print("textFieldDidBeginEditing: \(textField.placeholder!) text field")
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
if !(self.emailTextField.text?.isEmpty)! && !(self.passwordTextField.text?.isEmpty)! {
self.emailTextField.resignFirstResponder()
self.passwordTextField.resignFirstResponder()
}
else if !(self.emailTextField.text?.isEmpty)! {
self.passwordTextField.becomeFirstResponder()
}
print("textFieldShouldReturn: \(textField.placeholder!) text field w/ value: \(textField.text!)")
return true
}
При правильном формате электронной почты вводится в Email
текстовое поле и фокус перемещается к следующему текстовому полю (Password
) либо с помощью следующего ключа или вручную, нажав на следующем текстовом поле (Password
), следующие цепи методов делегата происходит, как и ожидалось (и понято):
console output:
Формат: [имя метода делегата: текстовое значение поля заполнитель (+ текст значение)]
textFieldShouldBeginEditing: Email text field
textFieldDidBeginEditing: Email text field
textFieldShouldBeginEditing: Password text field
textFieldShouldEndEditing returning true: Email text field w/ value: [email protected]
textFieldDidEndEditing: Email text field w/ value: [email protected]
textFieldDidBeginEditing: Password text field
email field is filled
textFieldShouldReturn: Email text field w/ value: [email protected]
Проблема возникает, когда неправильный отформатирован адрес электронной почты обнаружен на Email
текстовое поле. UITextFieldDelegate
метод textFieldShouldEndEditing
вызывается три раза вместо одного экземпляра в качестве примера UIAlertController
.
ps: вид предупреждения отображается только один раз на экране.
console output:
Формат: [имя метода делегата: текстового значение поля заполнителя (+ текст значение)]
textFieldShouldBeginEditing: Email text field
textFieldDidBeginEditing: Email text field
textFieldShouldBeginEditing: Password text field
//1st occurence
self.presentedViewController: nil
textFieldShouldEndEditing returnin false: Email text field w/ value: bob
//2nd occurence
self.presentedViewController: Optional(<UIAlertController: 0x7f9018662df0>)
textFieldShouldEndEditing returnin false: Email text field w/ value: bob
//3rd occurence
self.presentedViewController: Optional(<UIAlertController: 0x7f9018662df0>)
textFieldShouldEndEditing returnin false: Email text field w/ value: bob
Исходя из объяснений от этого так Нити: "textFieldShouldEndEditing called multiple times", я понимаю, что так как фокус вот-вот покинет текстовое поле Email
(началось первое появление метода textFieldShouldEndEditing
), фокус уже на текстовом поле Password
, таким образом получив статус первого ответчика. Но, поскольку обнаружен недействительный адрес электронной почты, появляется предупреждающий контроллер, и текстовое поле Password
резко теряет фокус и, таким образом, запускает textFieldShouldEndEditing
. Итак, я ожидал textFieldShouldEndEditing
только получить срабатывает дважды вместо трех раз (все из-за Email
текстовых полей), как это (один из-за Email
текстовое поле Другой из-за Password
текстового поля.):
textFieldShouldBeginEditing: Email text field
textFieldDidBeginEditing: Email text field
textFieldShouldBeginEditing: Password text field
self.presentedViewController: nil
textFieldShouldEndEditing returnin false: Email text field w/ value: bob
self.presentedViewController: Optional(<UIAlertController: 0x7f9018662df0>)
textFieldShouldEndEditing returnin false: Password text field w/ value: nil
Но, это не тот случай.Может ли кто-нибудь просветить, почему мое понимание неверно. Спасибо за любой указатель.
Привет, Харипал, я пробовал ваше предложение, но он вызывает следующую ошибку: 'Предупреждение: попытка представить в , который уже представляет (null)'. Единственный способ (я знаю), чтобы облегчить эту ошибку, - проверить, является ли 'представленViewController'ом нулевым. Если это нуль, тогда создайте контроллер предупреждения и действие, а затем представите его. Затем ошибка исчезла. Поэтому я вернулся на круги своя. –
yohannes
Вот код в [Pastebin:] (http://pastebin.com/a9vDZShB) – yohannes
Я использовал тот же подход, чтобы добиться того, что вы пытаетесь достичь ... Используйте ниже код, чтобы представить предупреждения контроллера dispatch_async (dispatch_get_main_queue()) { self.presentViewController (alertController, анимированный: true, завершение: ноль) } –