В Swift оба [someTextField].resignFirstResponder()
и self.view.endEditing(true)
выполняют ту же задачу - скрывая клавиатуру от пользовательского вида и дефокусируя любое текстовое поле. Я понимаю, что первое относится к определенному полю, в то время как последнее охватывает весь вид, но не хочет нацеливаться на конкретное текстовое поле, когда оно предпочтительнее/рекомендовано другим?
ResignFirstResponder vs. endEditing для отладки клавиатуры
Ответ 1
someTextField.resignFirstResponder()
resignFirstResponder()
полезно использовать в любое время, когда вы точно знаете, какое текстовое поле является первым ответчиком, и вы хотите отменить свой статус первого ответчика. Это может быть немного более эффективным, чем альтернатива, но если вы делаете что-то вроде создания пользовательского элемента управления, это может иметь большой смысл. Возможно, у вас есть текстовое поле, и когда нажата кнопка "Далее", вы хотите, например, избавиться от клавиатуры и представить сборщик дат. Здесь я бы определенно использовал resignFirstResponder()
self.view.endEditing(true)
Я обычно резервирую это для сценариев, когда мне просто нужно очистить клавиатуру, независимо от того, что происходит в данный момент, по любой причине. Может быть, у меня есть меню для переполнения? Перед тем, как это выйдет, независимо от того, что происходит, клавиатура должна уйти, поэтому я буду уверен, что все уйдет в отставку с первого статуса ответчика. Важно отметить, что endEditing()
будет просматривать всю иерархию подзаголовков и убедиться, что все, что является первым ответчиком, уходит в отставку. Это делает его менее эффективным, чем вызов resignFirstResponder()
, если у вас уже есть конкретная ссылка на первого ответчика, но если нет, это проще, чем найти это представление и уйти с него.
Ответ 2
Нет такого строгого правила.
Вы используете resignFirstResponder
, когда у вас есть ссылка на текстовое поле, в котором в настоящий момент находится статус первого ответчика. Если у вас нет ссылки или вы не уверены в этом, endEditing
выполнит трюк.
Следует отметить, что endEditing
имеет логический параметр, который мы иногда устанавливаем в true
. Установив этот параметр в значение true
, вид, на который был вызван endEditing
, заставит каждое дочернее текстовое поле сбрасывать статус первого ответчика независимо от того, что оно вернуло значение false
из метода textFieldShouldEndEditing
delegate. Наоборот, вызов endEditing
с помощью false
запрашивал бы (не принудительно) текстовое поле для выхода из системы, учитывая возвращаемое значение из метода протокола textFieldShouldEndEditing
.