У меня есть a UITableView
с UITextField
s как ячейки. Я хотел бы отклонить клавиатуру когда фон UITableView
затронут. Я пытаюсь сделать это путем создания a UIButton
размер UITableView
и размещение его позади UITableView
. Единственная проблема UIButton
ловит все касания, даже когда касание находится на UITableView. Что я делаю неправильно?
Спасибо!
Я сделал это так:
Создайте метод в вашем TableViewController для деактивации первого респондента (который на тот момент будет вашим TextBox)
- (BOOL)findAndResignFirstResonder:(UIView *)stView {
if (stView.isFirstResponder) {
[stView resignFirstResponder];
return YES;
}
for (UIView *subView in stView.subviews) {
if ([self findAndResignFirstResonder:subView]) {
return YES;
}
}
return NO;
}
В tableView: didSelectRowAtIndexPath:
вызовите предыдущий метод:
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
...
[self findAndResignFirstResonder: self.view];
...
}
Почему вы хотите создать таблицу с текстовыми полями? Вы должны использовать подробное представление для каждой строки, содержащей текстовые поля. Когда вы нажимаете подробное представление, убедитесь, что вы вызываете «[myTextField статьFirstResponder]», чтобы пользователь мог начать редактирование одним щелчком мыши от список таблиц.
Если вы готовы подклассифицировать (ух!) ваше представление таблицы, может сработать что-то вроде этого:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
BOOL backgroundTouched = YES;
for (UITouch *touch in touches) {
CGPoint location = [touch locationInView:self];
for (UITableViewCell *cell in self.visibleCells) {
if (CGRectContainsPoint(cell.frame, location)) {
backgroundTouched = NO;
break;
}
}
}
if (backgroundTouched) {
for (UITableViewCell *cell in self.visibleCells) {
// This presumes the first subview is the text field you want to resign.
[[cell.contentView.subviews objectAtIndex:0] resignFirstResponder];
}
}
[super touchesBegan:touches withEvent:event];
}
@interface DismissableUITableView : UITableView {
}
@end
@implementation DismissableUITableView
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.superview endEditing:YES];
[super touchesBegan:touches withEvent:event];
}
@end
Затем убедитесь, что в вашем файле Nib вы установили тип вашего UITableView на DismissableUITableView ..... возможно, я мог бы придумать лучшее имя для этого класса, но вы поняли суть .
UITableView является подклассом UIScrollView.
Я сделал это таким образом, чтобы прослушивать событие прокрутки пользователем, а затем resignFirstResponder. Вот метод UIScrollViewDelegate для реализации в вашем коде;
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
При подходе к такого рода проблемам я обнаружил, что лучший способ — исследовать протоколы делегирования для каждого объекта и протоколы родительских классов (в данном случае UITableViewDelegate, UIScrollViewDelegate. Количество событий, запускаемых NS-объектами, довольно велико и Также проще реализовать протокол, чем создать подкласс чего-либо
.