我正在编写一个带有tab视图中的表视图的iOS应用程序。在我的UITableViewController中,我实现了-tableView:didSelectRowAtIndexPath:,但当我在运行时选择一行时,该方法没有被调用。表格视图正在被填充,所以我知道控制器中的其他tableView方法正在被调用。
有没有人知道我到底搞砸了什么才让这一切发生的?
我正在编写一个带有tab视图中的表视图的iOS应用程序。在我的UITableViewController中,我实现了-tableView:didSelectRowAtIndexPath:,但当我在运行时选择一行时,该方法没有被调用。表格视图正在被填充,所以我知道控制器中的其他tableView方法正在被调用。
有没有人知道我到底搞砸了什么才让这一切发生的?
当前回答
在这篇文章中有一些惊人的线索和答案(可能是我见过的最好的讨论之一!)这里的线索帮助我找出了我的问题,但我仍然花了很多时间在键盘上流口水,试图发现问题,这和其他帖子类似。然而,我最终发现它的方式有点不同,所以我想分享一下,以防其他人也遇到它。
事实证明,我的问题是,在代码中,一个超类添加了一个全屏的“错误视图”,它不是隐藏的,而是透明的。然而,因为它在tableview之上,“user action”被设置为YES,它拦截了我在tableview上的触摸。
我用Xcode很酷的“Debug View Hierarchy”按钮诊断了这个问题。下面是一个带有注释的屏幕截图,希望能解释我做了什么,以及我最终是如何诊断问题的。
在代码中,我只需要做:
errorMessageView.setUserInteractionEnabled = NO;
// or
errorMessageView.hidden = YES;
其他回答
请检查UITapGestureRecognizer。 在我的例子中,tapgesture被添加到tableview所在的视图中,这消耗了UITableview的用户交互,比如didselect。 禁用视图的tapgesture后,触发了didselect委托。
另一个疯狂的可能性是:我在iPhone 5S上运行我的应用,我使用了:
- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
就像我过去一直做的那样。
然而,我没有仔细查看我的编译器警告…它说我应该把上面这一行改为:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
64位兼容性!摇动的拳头
当心,万一你开始扯你的头发。
这可能只是在我的情况下,但我从备份中重新加载了一些文件,一些东西不能工作,包括这个。在做了完全清洁(产品>清洁或Shift +命令+ K)后,它工作了。可能是在预编译的头文件中搞砸了。这对你来说可能不是问题,但值得一试。
记住在viewDidLoad方法中设置数据源和委托,如下所示:
[self.tableView setDelegate:self];
[self.tableView setDataSource:self];
您必须选择这些选项
但是如果你想让uitableview在点击时不突出显示,那么你应该改变UITableViewCell属性。
选择“选择”的“无”选项,如下所示