时间:2010-11-11 02:38:12

标签: ios uitableview

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

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

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

  1. App使用标签栏控制器。
  2. 每个标签的根控制器为UINavigationController
  3. 通过在第二个标签栏项目的导航控制器的导航堆栈上按下它来调用所讨论的视图控制器。
  4. 有问题的视图控制器的viewWillAppear方法重置基础数组,然后调用[_tableView reloadData]
  5. 实现UITabBarControllerDelegate的app委托实现tabBarController:didSelectViewController:方法,并在选择的视图控制器上调用popToRootViewControllerAnimated:
  6. 根视图控制器的viewWillAppear方法调用有问题的视图控制器上的方法,该方法会影响基础数组的内容。
  7. 重新解决问题的步骤:

    1. 启动应用
    2. 点按第二个标签项。
    3. 点按以显示有问题的视图控制器。在该视图上执行工作以填充表格。
    4. 点按第一个标签项。
    5. 点击第二项。
    6. 在第五步,这是调用的顺序:

      1. viewControllerInQuestion:viewWillAppear - 重新加载底层数组,调用[_tableView reloadData]
      2. viewControllerInQuestion:numberOfRowsInSection - 返回1
      3. App委托:didSelectViewController - 调用popToRootViewControllerAnimated
      4. secondTabBarRootViewController:viewWillAppear - 在viewControllerInQuestion上调用清除基础数组内容的方法
      5. viewControllerInQuestion:cellForRowAtIndexPath - 尝试访问基础数组中索引0处的对象时崩溃。
      6. 感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:1)

这对于在表视图上不正确地调用reloadData是一个问题。我继承了这段代码,但我已经足够iOS了,我不明白正确的用法。

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

答案 1 :(得分:0)

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