Вот мое решение, несколько вдохновленное несколькими публикациями в SO: просто обработайте жест касания в контексте View, пользователь «очевидно» пытается покинуть фокус UITextField.
-(void)handleViewTapGesture:(UITapGestureRecognizer *)gesture
{
[self endEditing:YES];
}
Это реализовано в ViewController. Обработчик добавляется в качестве распознавателя жестов к соответствующему представлению в установщике свойства представления:
-(void) setLoginView:(LoginView *)loginView
{
_loginView = loginView;
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self.loginView action:@selector(handleTapGesture:)];
[tapRecognizer setDelegate:self]; // self implements the UIGestureRecognizerDelegate protocol
[self.loginView addGestureRecognizer:tapRecognizer];
}
Обработчик также может быть определен в представлении. Если вы не знакомы с обработкой жестов, посмотрите документы Apple - это множество примеров в других местах.
Я должен упомянуть, что вам понадобится некоторый дополнительный код, чтобы убедиться, что другие элементы управления получают ответвления, вам нужен делегат, который реализует протокол UIGestureRecognizerDelegate, и этот метод:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if ([touch.view isKindOfClass:[UIButton class]]) // Customize appropriately.
return NO; // Don't let the custom gestureRecognizer handle the touch
return YES;
}