我正在编写一个带有tab视图中的表视图的iOS应用程序。在我的UITableViewController中,我实现了-tableView:didSelectRowAtIndexPath:,但当我在运行时选择一行时,该方法没有被调用。表格视图正在被填充,所以我知道控制器中的其他tableView方法正在被调用。

有没有人知道我到底搞砸了什么才让这一切发生的?


当前回答

如果UITapGestureRecognizer出现问题,你可以修复这个:

在故事板:

在Objective-C代码中:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; 
[self.view addGestureRecognizer:tap];

[tap setCancelsTouchesInView:NO];

Swift代码:

let tap = UITapGestureRecognizer(target: self, action:Selector("dismissKeyboard"))
view.addGestureRecognizer(tap)

tap.cancelsTouchesInView = false

其他回答

在这种情况下,我遇到了两件事。

你可能忘了实现UITableViewDelegate协议,或者在你的类和你的表视图之间没有委托出口。 你可能有一个UIView在你的行里面,它是一个第一响应器,拿走你的点击。比如UIButton或类似的东西。

确保在主线程上调用reloadData。如果你从某种异步方法(例如:某种网络请求)调用该方法,表视图可能会或可能不会正确响应(在某些情况下,应用程序甚至会崩溃)。

使用主线程代码块来执行reloadData调用,如果调用是在其他一些方法块中进行的(你不确定):

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    [tableView reloadData];
}];

我自己也有这个问题。我已经在IB中构建了视图的骨架(只是一个视图和一个TableView),委托没有设置。我把它连接到文件的所有者,它就像一个魅力。::保存::

检查你的viewController是否有以下方法:

- (BOOL) tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    return NO;
}

如果你返回“NO”,didSelectRow将不会被调用

如果UITapGestureRecognizer出现问题,你可以修复这个:

在故事板:

在Objective-C代码中:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; 
[self.view addGestureRecognizer:tap];

[tap setCancelsTouchesInView:NO];

Swift代码:

let tap = UITapGestureRecognizer(target: self, action:Selector("dismissKeyboard"))
view.addGestureRecognizer(tap)

tap.cancelsTouchesInView = false