18

在某些情况下, UITableViewdidSelectRowAtIndexPath被调用两次导致错误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 中选择单元格时都必须重新加载它。

任何人都知道可能导致这种情况的原因是什么?谢谢。

4

5 回答 5

32

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

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

    ... do other stuff

    }
于 2011-06-01T05:57:41.193 回答
1

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

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

于 2011-04-16T19:54:25.683 回答
1

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

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

在这种方法中;

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

于 2017-10-25T13:25:02.263 回答
0

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

于 2015-05-27T14:37:32.040 回答
0

斯威夫特 5

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

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

使用这个:

tableView.reloadData()
于 2020-09-13T16:57:43.517 回答