UITableView – 在外部触摸时重新响应第一响应者

我有一个UITableView与相关的UITableViewController。 但是,我已经修改了表格,也有一个带有文本字段子视图的视图。

和往常一样,我希望键盘在用户点击“完成”(简单)时以及当他们触摸屏幕以外的任何其他位置(硬盘,卡住!)时消失。

实现这一目标的常规方法是将类更改为UIControl,以便它可以处理操作……但我不能为我的UITableView / UITableViewController组合执行此操作。

我怎么解决这个问题?

您可以通过向视图添加UITapGestureRecognizer来处理用户触摸。
例如,如果您不想在tableView中启用行选择,请调用self.tableView.allowsSelection = NO;
但是,如果你仍想检测用户触摸,你可以在tableView(或tableView.superview)中添加UITapGestureRecognizer
如果你实现了UIGestureRecognizerDelegate ,你可以拥有更多的控制权,这样你就可以检测并选择接收的巫婆接触而不是。
要做到这一点,只需将此代码添加到您的UITableViewController

 - (void)viewDidLoad { [super viewDidLoad]; self.tableView.allowsSelection = NO; UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewTapped:)]; tgr.delegate = self; [self.tableView addGestureRecognizer:tgr]; // or [self.view addGestureRecognizer:tgr]; [tgr release]; } - (void)viewTapped:(UITapGestureRecognizer *)tgr { NSLog(@"view tapped"); // remove keyboard } 

//这是可选的,它让你选择接收的女巫触摸,例如在这里我正在检查用户是否已经点击了textField

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isKindOfClass:[UITextField class]]) { NSLog(@"User tapped on UITextField"); } return YES; // do whatever u want here } 

通常的做法是在键盘视图后面放置一个自定义UIButton(它只在uitextfield开始编辑时才可见),当用户点击屏幕时,他实际上点击了该按钮,相关的选择器可以让第一个响应者辞职。

 -(void) closeKeyboard:(UIButton *) b { [self.view endEditing:YES]; //assuming self is your top view controller. [b setHidden:YES]; } 

使用endEditing更好,因为它遍历所有子视图并查找当前的第一响应者。

在启用ARC的情况下使用alloc break

只需将以下内容添加到viewController即可

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { //where text field is a @property (nonatomic,retain) IBOutlet to your textfield [textField resignFirstResponder]; } 

当点击一行时,将调用didSelectRowAtIndexPath 。 如果点击位于行内部的textField,则调用textfield委托。

因此,除了完成按钮方法之外,在didSelectRowAtIndexPath添加对作为第一响应者的文本字段的检查并要求其辞职。 假设所选的indexPath不是textfield的行。