Запуск UITextField разматывается, нажав Return: Why/Как это работает?

В моем текущем проекте я обнаружил, что могу добавить раскручивание seigue в UITextField и запустить segue, нажав клавишу возврата, если я также добавил действие для обработки события didEndOnExit. Если обработчик didEndOnExit не подключен к событию, тогда сеанс не запускается.

Я хотел бы понять это поведение. Мой интерес связан с тем, что может быть что-то для меня, чтобы узнать о том, как действуют segues. С другой стороны, поведение может быть просто уникальным для UITextFields.

Этот простой проект GitHub демонстрирует поведение.

Благодарим вас за внимание.

Ответ 1

Вы сделали очень необычную вещь: вы привязали инициированный переход к текстовому полю, как его действие. Поэтому вопрос просто: что это значит? В частности, что вызывает срабатывание тайгера, прикрепленного к текстовому полю? Что такое "действие" текстового поля?

Я имею в виду, что мы знаем, что вызывает нажатие кнопки с нажатой кнопкой: это означает, что пользователь нажал кнопку. И мы знаем, что вызывает триггер с привязкой к ячейке просмотра таблицы: это то, что пользователь выбирает ячейку. Но как насчет текстового поля? Что должен сделать пользователь, чтобы вызвать его действие?

"Расслабляющий" бизнес - это красная селедка, поэтому пусть это исключает наше мышление. Удалите текстовое поле со второго контроллера представления и поместите его в первый контроллер представления. Прикрепите действие текстового поля как modal segue ко второму контроллеру представления.

Теперь рассмотрите текстовое поле в первом контроллере представления. Он ведет себя так, как вы описали:

  • Если мы щелкнем текстовое поле и нажмем и нажмем на возврат, ничего не произойдет.

  • Если мы добавим в конец поля "Конец выхода" в текстовое поле и введите и нажмите "Возврат", клавиатура будет отклонена, и мы перейдем к ней.

Хорошо, подумайте об этой фразе "ничего не случится" в первом пункте. Клавиатура не увольняется! Но увольнение клавиатуры - это текстовое поле "действие". Не было никаких действий. Таким образом, запуск действия не происходит.

Теперь попробуйте этот эксперимент: сделайте диспетчер представлений делегатом текстового поля и реализуйте этот метод:

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

Введите текстовое поле и нажмите Return. Клавиатура отклоняется, и мы переходим к следующему контроллеру. Отклоняя клавиатуру в ответ, клавиша Return - это действие текстового поля.

Таким образом, вы видите, что в некотором смысле обе развязки и ДиДеонОнЭксит были красными сельдевыми, так как я просто сделал то же самое без них. Каково значение текстового поля Action и запуск его действия Segue в ответ.