【问题标题】:iOS: Tapping on UITableView does not call didSelectRowAtIndexPathiOS:点击 UITableView 不会调用 didSelectRowAtIndexPath
【发布时间】:2012-09-18 14:01:01
【问题描述】:

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

当我点击一行时,它会突出显示,但不会调用委托方法 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,所以that is not the issue。 我没有为表使用多个UITableViewControllers,所以this is also not the issue

【问题讨论】:

  • 检查这些事情: 1. 确认您是代表。 2. 单元格是否包含任何其他视图?可能是 UIScrollView 或它的任何后代? 3. 你在主线程上运行什么要求很高的东西吗?
  • 1.是的,我绝对是代表。 2. 一些单元格包含 UIImageView(禁用用户交互),其余的仅包含通常的 UILabel。 3. 不,应用程序处于空闲状态。
  • 您是否对主 UIWindow 进行了任何类型的覆盖?
  • 您是否正确设置了窗口rootViewController?如果您没有这样做,iOS6 会导致一些事情发生故障。
  • @Mike M 我没有以任何方式覆盖主 UIWindow。

标签: ios ipad uitableview ios6


【解决方案1】:

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

我终于通过查看 xib 和表格的 属性检查器 弄明白了。在表格视图部分,我将 Selection 选项设置为 No Selection 并且未选择 Show Selection on Touch

Selection 选项更改为 Single Selection 实际上再次为我工作,并且未选中 Show Selection on Touch 意味着我没有'当行被选中时,看不到任何闪烁或颜色变化。

【讨论】:

  • 我检查了我的故事板文件。 Selection 设置为 Single SelectionShow Selection on Touch 似乎没有任何效果。
  • 我没有使用故事板,所以也许这就是为什么它对我来说不同。抱歉,我不能提供更多帮助。
  • 是的,在 IOS 6 和 7 上是正确答案,如果您将 table 设置为无选择,则不会调用“DidSelectRowAtIndexPath”。我已经对其进行了测试,它的工作原理就是这样。
【解决方案2】:

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

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

【讨论】:

  • 有趣。 scrollEnabled 对于 UITableView 来说是 YES,因为它可以变得比屏幕大,所以不是这样。但是你表示 iOS 6 在点击时对移动更敏感的迹象是我一定会调查的!我的印象是,在其他应用程序(主要是游戏)中执行某些点击变得更加困难,所以也许这是苹果必须解决的问题(不是他们承认存在问题......叹息; )。
  • 谢谢!那也是我的问题。真是奇怪的行为。如果你有一个不应该反弹的 ScrollView,你可以使用self.tableView.bounces = NO;
【解决方案3】:

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

我也实现了

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

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

【讨论】:

  • 我没有在我的代码中实现shouldHighlightRowAtIndexPath: 方法。有趣的是,似乎有多少不同的原因导致表面上看起来像同一个问题。很高兴您找到了解决方案!
  • 这就是我的原因。有趣...不知道为什么/如何影响它...
  • 刚刚被这个抓住了,浪费了半个小时。谢谢+1
  • @sergey glotov 现在我在使用 ios7 时遇到了同样的问题。并且不知道如何解决这个问题
  • @AnuragSoni 这不是我的答案,我只是更改了其中的格式。
【解决方案4】:

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

正确且唯一明智的解决方法是将Cancels touches 设置为NO。那么您的表格行选择应该可以正常工作。

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

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

    if (sender.view == someOldViewThatINeedToDealWith) {
        sender.cancelsTouchesInView = true;
    }
}

【讨论】:

    【解决方案5】:

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

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

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

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

    希望这会有所帮助。

    【讨论】:

    • 谢谢。我做了很多后台工作,并在 BG 线程中更新表。
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

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

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

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

      【讨论】:

        【解决方案8】:

        设置

        recognizer.cancelsTouchesInView = NO;
        

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

        【讨论】:

        • 我有一个 BaseViewcontroller “Parent”(带有 UIGestureRecognizerDelegate),还有一个 MenuViewcontroller “Child”,后者里面有一个 TableView。使用您的代码行消除无法识别tableView中的单个触摸的问题,因为必须用两根手指进行触摸才能与cellView交互,但我的解决方案是:@interface MenuViewController () -( void)ViewDidLoad{ .... [self.tableViewMenu addGestureRecognizer:tapGestureRecognizer]; tapGestureRecognizer.cancelsTouchesInView = NO;
        【解决方案9】:

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

        【讨论】:

          猜你喜欢
          • 2012-02-24
          • 1970-01-01
          • 1970-01-01
          • 2015-03-10
          • 2011-01-07
          • 2013-12-07
          • 2015-01-20
          • 1970-01-01
          相关资源
          最近更新 更多