iOS:点击UITableView不会调用didSelectRowAtIndexPath

时间:2012-09-26 20:58:16

标签: ios ipad uitableview ios6

我的应用使用带有UITableView的{​​{1}},以便在点击表格的一行时显示更详细的视图 - 基本的向下钻取例程。

当我点击一行时,它会突出显示,但不会调用委托方法UINavigationControllertableView:willSelectRowAtIndexPath:(使用调试程序验证)。

现在这是奇怪的部分:

  1. 应用程序中还有其他一些表格视图(它们没有向下钻取),但没有一个表现出问题。

  2. 如果我快速反复点击该行,经过多次尝试(10 - 20是正常的)后,tableView:didSelectRowAtIndexPath:tableView:willSelectRowAtIndexPath: 调用,处理继续正常

  3. 在运行iOS 6的(任何,实际上)iPad上发生问题。适用于运行iOS 5的iPad,或运行任何iOS版本的任何iPhone,6。也适用于使用iOS 5或6的iPad模拟器。

  4. 所以看起来在调用委托方法之前有些东西正在接收。但是什么?

    我没有使用任何tableView:didSelectRowAtIndexPath:,所以that is not the issue。 我没有在表格中使用多个UITapGestureRecognizer,因此this is also not the issue

9 个答案:

答案 0 :(得分:11)

在iOS6中运行时,我遇到了这个问题。 tableView:didSelectRowAtIndexPath:方法从未被触发,即使它在更新到iOS6之前正在工作。

我终于通过查看表的xib和属性检查器来弄明白了。在表格视图部分,我将选择选项设置为无选择,并且未选择触摸时显示选择

选择选项更改为单一选择实际上让我再次为此工作,并且触摸显示选择未选中意味着我没有选择行时,看不到任何闪光或颜色变化。

答案 1 :(得分:8)

我遇到了类似的问题。 iOS 6似乎对桌面视图单元上的轻微向上移动更加敏感。它似乎将最轻微的动作记录为滚动请求而不是单元格选择。我的表视图设置为scrollEnabled = NO,因为它是具有静态选择值的表视图。表格视图显示在较大的iPad视图的小区域内。如果我小心地敲击一个单元格并直接向上提起,则选择单元格。

要解决此问题,我将scrollEnabled更改为YES,并确保专用于我的tableView的区域大于显示表格视图所需的实际区域,从而阻止其滚动。不确定这是否是您遇到的问题的原因,但希望它有所帮助。

答案 2 :(得分:6)

我遇到了同样的问题。在iOS6中运行时,UITableView没有触发didSelectRowAtIndexPath方法,但它在iOS5.1中运行良好。

我也实现了

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

并返回NO。在iOS5中,一切正常,但是当我切换到iOS6时,它将停止触发didSelectRowAtIndexPath。删除shouldHighlightRow方法后,一切都在iOS6中有效。干杯!

答案 3 :(得分:5)

didSeletRowAtIndexPath()未被调用的常见原因是,您的viewcontroller上UITapGestureRecognizer的{​​{1}}视图设置为Cancels touches

正确且唯一合理的解决方法是将YES设置为Cancels touches。然后你的表行选择应该很好。

显然这对你的手势处理程序有一些影响 - 你可能需要在你的手势处理程序中添加一些代码来阻止你的观点进行一些触摸,例如。

NO

答案 4 :(得分:4)

我尝试了所有其他答案,尽管他们似乎很有希望,但他们没有解决问题。

我已经在我的案例中发现问题的原因:我在另一个线程上调用[self.tableView reloadData](由于处理从后台工作线程发布的NSNotification事件)。

我通过将[self.tableView reloadData]更改为

来解决问题
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

希望这有帮助。

答案 5 :(得分:2)

另一个嫌疑人可能是一个Tap手势识别器设置到视图控制器的视图吞咽所有水龙头像黑洞。删除手势识别器将启用did select。我只是遇到了同样的问题,并且轻拍手势就是原因。

答案 6 :(得分:1)

分辨率非常奇怪:UITableViewController注册了所有通知。在通知的处理程序中,使用

重新加载表视图数据
[self.tableView reloadData]

根据Apple DTS,当表重新加载数据时,这会导致向观察者发送通知,从而导致竞争状况......

没有解释为什么它有时会起作用或为什么它总能在iPhone上运行。但只注册 一小部分通知(即我真正感兴趣的那些)解决了这个问题!

答案 7 :(得分:1)

设置

recognizer.cancelsTouchesInView = NO;
如果您的用例允许同时处理,

会处理它 通过[tap]手势识别器触摸(例如kdb dismiss) 和识别器附加的视图。

答案 8 :(得分:0)

在我的情况下,我喜欢在tableviewcell之前收到所有触摸事件的按钮