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

Con*_*oob 1 xcode cocoa-touch uitableview ios

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

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

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

我怎么解决这个问题?

Eya*_*yal 5

你可以通过UITapGestureRecognizer在视图中添加一个来处理用户触摸.
例如,如果你不想在你的tableView中启用行选择你调用self.tableView.allowsSelection = NO;
但是如果你仍然想要检测用户触摸你添加UITapGestureRecognizer到tableView(或tableView.superview).
如果你实施的话,你可以有更多的控制权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
}
Run Code Online (Sandbox Code Playgroud)

//这是可选的,它让你选择接收的女巫触摸,例如在这里我正在检查用户是否已经点击了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
}
Run Code Online (Sandbox Code Playgroud)

  • 正如@Matt Rees在另一个线程(http://stackoverflow.com/a/11142038/285853)上所述,您需要设置tapGesture.cancelsTouchesInView = NO; 如果您希望其他视图像往常一样继续接收触摸. (2认同)