2016-08-09 3 views
1

У меня есть контроллер представления под названием LoginViewController, который соответствует UITextFieldDelegate и имеет два текстовых поля объекты, а именно Email и Password. Там есть функция проверки электронной почты наложенная на текстовом поле Email и если проверка не пройдена, экземпляр UIAlertController будет удар вtextFieldShouldEndEditing метод делегата вызываются несколько раз на одном текстовом поле объекта, когда экземпляр UIAlertController выполняется

Вот скриншоты сцен и код, прежде чем я продолжу с моим вопросом:.

Log In Scene

Log In Scene with Error

пс: Есть много печати заявление, чтобы позволить мне понять, поток выполнения

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 

Но, это не тот случай.Может ли кто-нибудь просветить, почему мое понимание неверно. Спасибо за любой указатель.

ответ

1

Поместите код проверки электронной почты в

func textFieldDidEndEditing(textField: UITextField) 

вместо

func textFieldShouldEndEditing(textField: UITextField) -> Bool 

и перед показом предупреждения контроллера вы можете также добавить (если вы хотите)

self.view.endEditing(true) 

и на tap OK действие вы можете установить

self.emailTextField.becomeFirstResponder() 

Надеюсь, что этот подход решит вашу проблему.

+0

Привет, Харипал, я пробовал ваше предложение, но он вызывает следующую ошибку: 'Предупреждение: попытка представить в , который уже представляет (null)'. Единственный способ (я знаю), чтобы облегчить эту ошибку, - проверить, является ли 'представленViewController'ом нулевым. Если это нуль, тогда создайте контроллер предупреждения и действие, а затем представите его. Затем ошибка исчезла. Поэтому я вернулся на круги своя. – yohannes

+0

Вот код в [Pastebin:] (http://pastebin.com/a9vDZShB) – yohannes

+0

Я использовал тот же подход, чтобы добиться того, что вы пытаетесь достичь ... Используйте ниже код, чтобы представить предупреждения контроллера dispatch_async (dispatch_get_main_queue()) { self.presentViewController (alertController, анимированный: true, завершение: ноль) } –

 Смежные вопросы

  • Нет связанных вопросов^_^