cellForRowAtIndexPath 在比 numberOfRowsInSection 更晚被调用后崩溃

Posted

技术标签:

【中文标题】cellForRowAtIndexPath 在比 numberOfRowsInSection 更晚被调用后崩溃【英文标题】:cellForRowAtIndexPath crashes after being called much later than numberOfRowsInSection 【发布时间】:2010-11-11 02:38:12 【问题描述】:

我遇到了一个问题,其中tableView:numberOfRowsInSection: 被调用,然后另一个方法被调用影响底层数组,然后tableView:cellForRowAtIndexPath: 被调用并崩溃,因为底层数组的内容与 @ 时不同987654323@ 被调用。如果框架在调用cellForRowAtIndexPath 之前调用numberOfRowsInSection,则不会有问题。

由于我不能指望在短期内修复框架,我正在寻找的最简单的解决方案是如果底层数组不包含请求的条目,则返回一个虚拟单元。

有关此问题如何发生的更多详细信息:

    应用使用标签栏控制器。 每个选项卡的根控制器是UINavigationController。 有问题的视图控制器是通过将其推送到第二个标签栏项的导航控制器的导航堆栈上来调用的。 相关视图控制器的 viewWillAppear 方法会重置底层数组,然后调用 [_tableView reloadData]。 实现了 UITabBarControllerDelegate 的应用程序委托实现了tabBarController:didSelectViewController: 方法并在被选中的视图控制器上调用popToRootViewControllerAnimated:。 根视图控制器的 viewWillAppear 方法调用相关视图控制器上的一个方法,该方法会影响底层数组的内容。

重现问题的步骤:

    启动应用程序。 点按第二个标签项。 点击以调出有问题的视图控制器。在该视图上执行工作以填满表格。 点按第一个标签项。 点按第二项。

第五步,调用顺序如下:

    viewControllerInQuestion:viewWillAppear - 重新加载底层数组,调用 [_tableView reloadData] viewControllerInQuestion: numberOfRowsInSection - 返回 1 应用委托:didSelectViewController - 调用 popToRootViewControllerAnimated secondTabBarRootViewController: viewWillAppear - 调用 viewControllerInQuestion 上的方法来清除底层数组的内容 viewControllerInQuestion:cellForRowAtIndexPath - 尝试访问底层数组中索引 0 处的对象时崩溃。

感谢您能给我的任何帮助。

【问题讨论】:

【参考方案1】:

结果证明这是在表格视图上对 reloadData 的不当调用造成的问题。我继承了这段代码,但我对 ios 还不够陌生,所以我不了解正确的用法。

代码在 loadView 和 viewWillAppear 中都调用了 [_tableView reloadData]。删除这两个调用解决了这个特殊问题。

【讨论】:

【参考方案2】:

我遇到了类似的问题。 如果您的控制器中有一个调用reloadData 的观察者,请使用viewWillAppear 方法添加观察者并使用viewWillDisappear 删除它。

【讨论】:

以上是关于cellForRowAtIndexPath 在比 numberOfRowsInSection 更晚被调用后崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何在比 iOS 6.0 更早的 iOS 版本中从 UITextRange 获取矩形

是否有可能在比(n 选择 3)更好的时间内找到可以从长度列表中形成的三角形数量?

tableView(cellForRowAtIndexPath) 与 tableView.cellForRowAtIndexPath()?

cellForRowAtIndexPath:XCode 模板是不是正确?

从 cellForRowAtIndexPath 中调用 heightForRowAtIndexPath?

cellForRowAtIndexPath:reloaddata 未调用