Так что мне просто нужно было решить эту самую проблему, и ни один из предыдущих ответов не работал для меня из коробки.Моя ситуация: UISearchBar
, плюс ряд других элементов управления на экране.Я хочу, чтобы нажатие за пределами панели поиска закрывало клавиатуру, но , а не , распространяется на другие элементы управления.Когда клавиатура скрыта, я хочу, чтобы все элементы управления работали.
Что я сделал:
1) Реализовал собственный обработчик касаний в моем контроллере вида.
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
{
if searchBar.isFirstResponder()
{
// This causes the first responder, whoever it is, to resign first responder, and hide the keyboard.
// We also "eat" the touch here and not allow it to propagate further.
view.endEditing(true)
}
else
{
// OK to propagate the touch
super.touchesBegan(touches, withEvent: event)
}
}
2) Добавлена пара методов делегатов (мой для UISearchBar, но есть аналогичные для UITextField).controlContainerView
в приведенном ниже коде - это UIView, в котором есть несколько кнопок.Помните, что установка userInteractionEnabled
в суперпредставлении отключает все его подпредставления.
func searchBarTextDidBeginEditing(searchBar: UISearchBar)
{
controlContainerView.userInteractionEnabled = false
someButton.userInteractionEnabled = false
}
func searchBarTextDidEndEditing(searchBar: UISearchBar)
{
searchBar.resignFirstResponder()
// Done editing: enable the other controls again.
controlContainerView.userInteractionEnabled = false
someButton.userInteractionEnabled = false
}