16

当点击表格的一行时,我的应用程序使用 aUITableViewUINavigationController显示更详细的视图 - 基本的向下钻取例程。

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

现在这是奇怪的部分:

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

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

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

因此,在调用委托方法之前,似乎有些东西正在接收点击。但是什么?

我没有使用任何UITapGestureRecognizer,所以这不是问题。我没有使用多个UITableViewControllers表,所以这也不是问题

4

9 回答 9

11

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

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

将选择选项更改为单个选择实际上会再次为我工作,并将显示选择触摸未选择意味着在选择行时,我没有看到任何闪存或更改颜色。

于 2012-10-24T17:46:52.440 回答
8

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

为了解决这个问题,我更改scrollEnabledYES并确保我的 tableView 专用区域大于显示 table view 所需的实际区域,从而防止它滚动。不确定这是否是您遇到问题的原因,但希望对您有所帮助。

于 2012-10-01T17:38:22.503 回答
6

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

我还实施了

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

并返回 NO。在 iOS5 中一切正常,但在我切换到 iOS6 的那一刻,它将停止触发didSelectRowAtIndexPath. 一旦我删除了该shouldHighlightRow方法,一切都在 iOS6 中再次运行。干杯!

于 2012-12-20T16:51:53.267 回答
5

didSeletRowAtIndexPath()没有被调用的通常原因是UITapGestureRecognizer在您的视图控制器上有一个Cancels touchesin 视图设置为YES.

正确且唯一明智的解决方法是将Cancels touches视图设置为NO. 然后您的表格行选择应该可以很好地工作。

显然,这对您的手势处理程序有一些影响 - 您可能需要向您的手势处理程序添加一些代码以阻止对您的视图进行一些触摸,即

- (IBAction)onTapGesture:(UITapGestureRecognizer *)sender {

    if (sender.view == someOldViewThatINeedToDealWith) {
        sender.cancelsTouchesInView = true;
    }
}
于 2014-07-08T14:51:40.393 回答
4

我尝试了所有其他发布的答案,虽然它们看起来很有希望,但它们并没有解决问题。

从那以后,我发现了问题的原因:我正在调用[self.tableView reloadData]另一个线程(由于处理从后台工作线程发布的 NSNotification 事件)。

我通过更改[self.tableView reloadData]为解决了问题

[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

希望这可以帮助。

于 2013-09-30T17:56:24.473 回答
2

另一个嫌疑人可能是一个 Tap Gesture Recognizer 设置为视图控制器的视图,像黑洞一样吞噬所有的水龙头。移除手势识别器将启用确实选择。我只是遇到了同样的问题,点击手势是原因。

于 2014-12-21T06:59:53.137 回答
1

分辨率真的很奇怪:为所有通知注册的 UITableViewController。在通知的处理程序中,正在使用重新加载表视图数据

[self.tableView reloadData]

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

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

于 2012-10-31T21:04:20.870 回答
1

环境

recognizer.cancelsTouchesInView = NO;

如果您的用例允许通过 [tap] 手势识别器(例如 kdb 关闭)和识别器附加到的视图同时处理触摸,则会处理它。

于 2018-02-01T11:59:01.423 回答
0

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

于 2014-07-25T11:05:23.553 回答