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

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


当前回答

即使另一个答案已经被接受,我将为观察这个问题的人补充一个可能的问题和解决方案:

If you have automatic reference counting (ARC) turned on, you may find that even after assigning your controller as a delegate of the view, the view's messages to the controller are not being received because ARC is deleting the controller. Apparently the UITableView's delegate pointer does not count as a reference for the ARC, so if that is the only reference to it, the controller will be dealloc'd. You can verify whether or not this is happening by implementing the dealloc method on the controller and setting a breakpoint or NSLog call there.

解决方案是在其他地方使用强引用跟踪控制器,直到确定不再需要它为止。

其他回答

检查- hightforrowatindexpath是否不返回0。

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

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

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

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

在我的案例中,解决方案是在下面的函数中将NO更改为YES。

iOS 9 +

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

我刚遇到这个问题,但它并没有马上发生;在选择了几个单元格之后,它们将停止调用didSelectItemAtIndexPath。我意识到问题是集合视图将allowmultipleselection设置为TRUE。因为单元格从未被取消选择,这阻止了未来调用didSelectItemAtIndexPath。