Я думал обсудить все возможные способы скрыть клавиатуру в приложении iOS и выяснить, какой из них лучше всего подходит.

У UITextFields есть клавиатура, как только вы начинаете редактировать клавиатуру. Обязанностью разработчика является написать код, чтобы его отклонить.

Позвольте мне объяснить несколько методов, как это сделать, особенно когда на вашем контроллере просмотра есть несколько UITextFields.

1-h84WFIZeg3_AgbRBT1tDzA

1. Первый способ
Внесите делегат textFieldShouldReturn в контроллер просмотра и спрячьте каждую клавиатуру.

func textFieldShouldReturn(textField: UITextField) -> Bool {
   self.textField1.resignFirstResponder()
   self.textField2.resignFirstResponder()
   return true
}

это решение может быть громоздким, если у вас тоже есть текстовые поля в вашем контроллере просмотра.

2. Второй способ
В функции textFieldShouldReturn delegate вы можете вызвать метод self.view endEditing.

func textFieldShouldReturn(textField: UITextField) -> Bool {
   self.view.endEditing(true)
   return true
}

аккуратный и чистый, не так ли?

3. Третий способ
Второй способ может быть лучшим способом, за исключением одного случая, когда клавиатура не имеет ключа возврата, например — номерная панель (UIKeyboardType.NumberPad).

1-mUBddCMZzsChMoymdsAegA

Как вариант добавить UIToolbar и в нем поместить кнопку Done.

override func viewDidLoad() {
   super.viewDidLoad()
   //init toolbar
   let toolbar:UIToolbar = UIToolbar(frame: CGRect(x: 0, y: 0,  width: self.view.frame.size.width, height: 30))
   //create left side empty space so that done button set on right side
   let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
   let doneBtn: UIBarButtonItem = UIBarButtonItem(title: “Done”, style: .done, target: self, action: Selector(“doneButtonAction”))
   toolbar.setItems([flexSpace, doneBtn], animated: false)
   toolbar.sizeToFit()
   //setting toolbar as inputAccessoryView
   self.textField1.inputAccessoryView = toolbar
   self.textField2.inputAccessoryView = toolbar
}
func doneButtonAction() {
   self.view.endEditing(true)
}

1-EBNT3CoEbCCkOq0MeSXAuA

4. Четвертый способ
С Swift 3.0 вы можете сделать что-то вроде:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}

В вашем контроллере, с которым вы хотите иметь такое поведение. Он также работает через другие виды, например, нажимая на ярлык в вашем контроллере.

Лучшее решение
Что может быть лучше, чем отслеживать в любом месте контроллера вида, чтобы отклонить клавиатуру. Только одна строка кода будет служить нашей цели. Добавьте распознаватель жестов при нажатии на self.view, установите цель как self.view и установите селектор endEditing: (в ViewDidLoad () или в любом месте, где вам нравится)

self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: Selector(“endEditing:”)))

Поскольку дядя Бен сказал: «Великая сила приходит с большой ответственностью», могут возникнуть проблемы, если вы имеете дело с табличными видом и добавляете выше жест нажатия. Вы можете получить проблемы при выборе строк, путь didSelectRowAtIndex не может быть запущен до нажатия долго.

Поэтому для этого есть решение. Измените код выше, как показано ниже.

let tap = UITapGestureRecognizer(target: self.view, action: Selector(“endEditing:”))
tap.cancelsTouchesInView = false
self.view.addGestureRecognizer(tap)

Просто убедитесь, что cancelsTouchesInView установлен false.

Авторы: Kaushal Elsewhere, Jeff Scaturro
Ссылка на статью: Best way to dismiss Keyboard in a View Controller iOS (Swift), Article