UITableView didSelectRowAtIndexPath调用两次

时间:2011-04-16 16:42:34

标签: iphone tableview didselectrowatindexpath

在某些情况下,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中选择单元格时重新加载它。

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

5 个答案:

答案 0 :(得分:32)

我也看到了这个问题,可能是1000个用户中的一个受到影响,或者更少。我可以清楚地看到两个didSelectRowAtIndexPath一个接一个地注册50毫秒。我的猜测是它是iOS中的一个错误 - 一旦推出了新的视图控制器,就不应该将新的指示器指向旧视图。唉,我们可能会编写代码来防范这种情况。这就是我的想法:

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

    ... do other stuff

    }

答案 1 :(得分:1)

在第一个“didSelectRow”后禁用用户互动。在过渡期间,多个分接头可以“叠加”。

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

答案 2 :(得分:1)

如果你已经创建了Storyboard Segue,请不要打电话;

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

在这种方法中;

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

快捷键5

就我而言,它还帮助更新了单元格,而不是此代码:

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

使用此:

tableView.reloadData()