我正在编写一个带有tab视图中的表视图的iOS应用程序。在我的UITableViewController中,我实现了-tableView:didSelectRowAtIndexPath:,但当我在运行时选择一行时,该方法没有被调用。表格视图正在被填充,所以我知道控制器中的其他tableView方法正在被调用。
有没有人知道我到底搞砸了什么才让这一切发生的?
我正在编写一个带有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
其他回答
在这篇文章中有一些惊人的线索和答案(可能是我见过的最好的讨论之一!)这里的线索帮助我找出了我的问题,但我仍然花了很多时间在键盘上流口水,试图发现问题,这和其他帖子类似。然而,我最终发现它的方式有点不同,所以我想分享一下,以防其他人也遇到它。
事实证明,我的问题是,在代码中,一个超类添加了一个全屏的“错误视图”,它不是隐藏的,而是透明的。然而,因为它在tableview之上,“user action”被设置为YES,它拦截了我在tableview上的触摸。
我用Xcode很酷的“Debug View Hierarchy”按钮诊断了这个问题。下面是一个带有注释的屏幕截图,希望能解释我做了什么,以及我最终是如何诊断问题的。
在代码中,我只需要做:
errorMessageView.setUserInteractionEnabled = NO;
// or
errorMessageView.hidden = YES;
注意故事板中的UITableView属性,在我的例子中发生的是,我在故事板中选择了combox为“Selection: Single Selection”,这不允许didSelectRowAtIndexPath方法运行。
检查- hightforrowatindexpath是否不返回0。
在我的例子中,问题是将方法声明为private。
这并没有起作用:
private func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
这工作:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
另一件可能导致问题的事情是不被选择的选择类型:
正常选择应为单选择,不应为无选择。
要以编程方式做到这一点,请执行:
tableView.allowsSelection = YES