Подтвердить что ты не робот

ResignFirstResponder vs. endEditing для отладки клавиатуры

В Swift оба [someTextField].resignFirstResponder() и self.view.endEditing(true) выполняют ту же задачу - скрывая клавиатуру от пользовательского вида и дефокусируя любое текстовое поле. Я понимаю, что первое относится к определенному полю, в то время как последнее охватывает весь вид, но не хочет нацеливаться на конкретное текстовое поле, когда оно предпочтительнее/рекомендовано другим?

4b9b3361

Ответ 1

someTextField.resignFirstResponder()

resignFirstResponder() полезно использовать в любое время, когда вы точно знаете, какое текстовое поле является первым ответчиком, и вы хотите отменить свой статус первого ответчика. Это может быть немного более эффективным, чем альтернатива, но если вы делаете что-то вроде создания пользовательского элемента управления, это может иметь большой смысл. Возможно, у вас есть текстовое поле, и когда нажата кнопка "Далее", вы хотите, например, избавиться от клавиатуры и представить сборщик дат. Здесь я бы определенно использовал resignFirstResponder()

self.view.endEditing(true)

Я обычно резервирую это для сценариев, когда мне просто нужно очистить клавиатуру, независимо от того, что происходит в данный момент, по любой причине. Может быть, у меня есть меню для переполнения? Перед тем, как это выйдет, независимо от того, что происходит, клавиатура должна уйти, поэтому я буду уверен, что все уйдет в отставку с первого статуса ответчика. Важно отметить, что endEditing() будет просматривать всю иерархию подзаголовков и убедиться, что все, что является первым ответчиком, уходит в отставку. Это делает его менее эффективным, чем вызов resignFirstResponder(), если у вас уже есть конкретная ссылка на первого ответчика, но если нет, это проще, чем найти это представление и уйти с него.

Ответ 2

Нет такого строгого правила.

Вы используете resignFirstResponder, когда у вас есть ссылка на текстовое поле, в котором в настоящий момент находится статус первого ответчика. Если у вас нет ссылки или вы не уверены в этом, endEditing выполнит трюк.

Следует отметить, что endEditing имеет логический параметр, который мы иногда устанавливаем в true. Установив этот параметр в значение true, вид, на который был вызван endEditing, заставит каждое дочернее текстовое поле сбрасывать статус первого ответчика независимо от того, что оно вернуло значение false из метода textFieldShouldEndEditing delegate. Наоборот, вызов endEditing с помощью false запрашивал бы (не принудительно) текстовое поле для выхода из системы, учитывая возвращаемое значение из метода протокола textFieldShouldEndEditing.