Аналогично этот вопрос У меня есть собственный подкласс UITableViewCell, который имеет UITextField. Он отлично работает, за исключением клавиатуры, которая не исчезает, когда пользователь касается другой ячейки табличного представления или чего-либо вне таблицы. Я пытаюсь найти лучшее место, чтобы узнать, когда что-то находится вне ячейки, а затем я могу вызвать resignFirstResponder для текстового поля.
Если бы UITableViewCell мог получать события касания для касаний вне его представления, то он мог бы просто сам resignFirstResponder, но я не вижу способа получить эти события в ячейке.
РЕДАКТИРОВАТЬ: Я пытался это (ниже) в моем подклассе UITableViewCell, но это не работает, я думаю, потому что touchesBegan: withEvent: не вызывается, если событие было обработано контроль. Я думаю, что мне нужно перехватить события, прежде чем они каким-то образом отправят цепочку респондента.
Решение, которое я рассматриваю, заключается в добавлении метода touchesBegan: withEvent: в контроллер представления. Там я мог бы отправить resignFirstResponder всем видимым ячейкам таблицы, кроме той, в которой было касание (пусть оно получает событие касания и обрабатывает его само).
Может быть, что-то вроде этого псевдокода:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
CGPoint touchPoint = // TBD - may need translate to cell's coordinates
for (UITableViewCell* aCell in [theTableView visibleCells]) {
if (![aCell pointInside:touchPoint withEvent:event]) {
[aCell resignFirstResponder];
}
}
}
Я не уверен, что это лучший способ сделать это. Похоже, что сама ячейка просмотра таблицы никак не может получать уведомления о событиях за ее пределами.
EDIT2: Я думал, что у меня есть ответ (я даже опубликовал его как ответ), используя hitTest: withEvent:, но это не сработало. Это не всегда называют. : - (