【问题标题】:UITableView didSelectRowAtIndexPath called twiceUITableView didSelectRowAtIndexPath 调用了两次
【发布时间】:2011-08-06 23:26:02
【问题描述】:

在某些情况下,UITableView didSelectRowAtIndexPath 被调用两次导致错误Pushing the same view controller instance more than once is not supported

以下是事件的顺序:

TableView::didSelectRowAtIndexPath.  
TableView::viewWillDisappear.  
PushedViewController::viewWillAppear.  
TableView::didSelectRowAtIndexPath.  
Error: Pushing the same view controller instance more than once is not supported'  

唯一值得注意的是 UITableView 正在异步加载图像,但它从不调用didSelectRowAtIndexPath。此外,PushedViewController 被重用以避免每次在 UITableView 中选择单元格时都必须重新加载它。

有人知道是什么原因造成的吗? 谢谢。

【问题讨论】:

  • 贴一些相关代码?
  • 确保你调用的 deselectrowatindx 路径没有选择......
  • 狂喜,我不打电话给任何一个。杰米,什么相关的代码?有一个 pushViewController 然后发生上述情况(不是所有时间)。
  • 你能发布第二个didSelectRowAtIndexPath:的堆栈跟踪吗?

标签: iphone tableview didselectrowatindexpath


【解决方案1】:

我也看到了这个问题,可能每 1000 个用户中就有一个受到影响,或者更少。我可以清楚地看到两个 didSelectRowAtIndexPath 一个接一个地注册 50 毫秒。我的猜测是这是 iOS 中的一个错误——一旦新的视图控制器被推送,就不应将新的点击定向到旧视图。唉,我们很可能要编写代码来防止这种情况发生。这是我的想法:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath {
        if (self.navigationController.topViewController != self)        
            return;

    ... do other stuff

    }

【讨论】:

  • 这个修复很简单,并且可以正常工作。顺便说一句:在我的应用程序上,我可以随时重现此问题。 1.打开应用程序。 2. 转到正在从 Internet 加载信息的表视图控制器。 3.在加载时疯狂地点击任何行。 4.多次DidSelect被触发,detailViewController被多次推送
  • 我遇到了这个问题,特别是在 didSelectRowAtIndexPath 中手动执行 segue 时。我做了一些测试以确保这不会抢占合法的单元格选择,你瞧,它就像一个魅力!
【解决方案2】:

在第一个“didSelectRow”之后禁用用户交互。在过渡期间,多次点击可能会“叠加”。

通常需要手指非常灵巧的人才能获得这种行为,但仍然如此。

【讨论】:

  • [一个手指灵巧的人可以得到这种行为]。你是对的,但它正在发生。这是否意味着你以前见过这个?会不会是 iOS 的 bug?
  • 一个像该死的测试员一样灵巧的人
  • 亚当,是的,没错。 @ED。 : 是不是iOS的bug,我不知道。如果我没记错的话,在最近的 iOS 7 中也绝对可以看到。
  • 您可以轻松地重新创建它,方法是在任意位置点击断点以冻结应用程序(或者只需按暂停键),然后双击单元格然后继续。在 didSelectRow 处再设置一个断点,您会看到它命中了两次。
【解决方案3】:

如果您已经创建了 Storyboard Segue,请不要调用;

[self performSegueWithIdentifier:@"TYPE" sender:self];

在这个方法中;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

【讨论】:

    【解决方案4】:

    这是因为您在didSelectRowAtIndexPath 方法中使用了segue。确保通过 ctrl 从源视图控制器顶部的视图按钮拖动到目标视图控制器来创建此 segue。当您通过 ctrl 从表格视图单元拖动到目标视图控制器来创建 segue 时,会发生错误。 您不需要更改任何代码。只需删除 segue 并以正确的方式创建它。希望这能解决您的问题,如果我的问题是正确的。

    【讨论】:

      【解决方案5】:

      斯威夫特 5

      在我的情况下,也有助于更新单元格而不是此代码:

      tableView.reloadRows(at: [indexPath], with: .automatic)
      

      使用这个:

      tableView.reloadData()
      

      【讨论】:

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