【发布时间】: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 处的对象时崩溃。
感谢您能给我的任何帮助。
【问题讨论】:
标签: ios uitableview