UIAlertController с текстовым полем: как работает клавиатура? - PullRequest
0 голосов
/ 11 июня 2018

В моем подклассе UIViewController я создал UIAlertController с UITextField:

class MyViewController: UIViewController {
...

     let alertController = UIAlertController(title: "a title", message: "", preferredStyle: .alert)
     let okAction = UIAlertAction(title: "OK!", style: .default) { alert in
          print("OK!!")
     }
     alertController.addTextField { (textField) in
     textField.placeholder = "a placeholder"
     textField.delegate = self
     }
     alertController.addAction(okAction)
     self.present(alertController, animated: true, completion: nil)

...

}

extension MyViewController: UITextFieldDelegate {
      func textFieldShouldReturn(_ textField: UITextField) -> Bool {
          return true
      }
}

Теперь, когда отображается предупреждение, и я нажимаю кнопку «Далее / Готово» клавиатуры, клавиатуру и предупреждениеотклоняются, и OK! печатается.

В моем методе textFieldShouldReturn нет ни textField.resignFirstResponder(), ни команды оповещения об отклонении, так как же возможно, что клавиатура и оповещение отклоняются?Как Apple добивается такого поведения?Имеет textField двух делегатов?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Я хотел понять поведение Apple UIAlertController, чтобы добавить то же поведение в мой настраиваемый контроллер предупреждений, который я внедряю.С помощью @ matt's answer, я думаю, я понял, как работает UIAlertController.Ниже моего фрагмента кода подключите все текстовые поля оповещения:

guard let last = textFields.last else {
    return
}
for i in 0 ..< textFields.count - 1 {
    textFields[i].returnKeyType = .next
    textFields[i].addTarget(textFields[i+1], action: #selector(UIResponder.becomeFirstResponder), for: .editingDidEndOnExit)
}
last.returnKeyType = .done
last.addTarget(last, action: #selector(UIResponder.resignFirstResponder), for: .editingDidEndOnExit)

Таким образом, когда я нажимаю на клавиатуре кнопку «Далее / Готово», а последнее текстовое поле является первым респондентом, клавиатура отклоняется;в противном случае следующее текстовое поле становится первым респондентом.

Этот пост тоже помог.

0 голосов
/ 11 июня 2018

На самом деле, вы не ставите вопрос достаточно сильно.Вы можете удалить свой добавочный номер и строку textField.delegate = self, и предупреждение все равно будет отклонено, когда пользователь нажмет кнопку Return.

Такое поведение является автоматическим для предупреждения.Если вы не отключите кнопку «Отменить», она будет по умолчанию нажата для вас, когда пользователь нажмет «Вернуть» на виртуальной клавиатуре.

Что касается действующего механизма, то это editingDidEndOnExit управляющее событие.Это дает вам право назначать делегата, не мешая.

...