UITableView的reloadData有时不会调用numberOfRowsInSection

时间:2013-05-19 11:47:21

标签: ios uitableview

[tableView reloadData]不会致电numberOfRowsInSection:(NSInteger)section

如果我看到这样的问题,我会在stackoverflow中写一个答案:

  • 确保委托和dataSource完美连接。
  • 如果您是从主线程调用它,请检查它。

在提出问题之前,我尝试了我的答案。

我将以下行放在MyTableView类中(从UITableView扩展)

- (void)reloadData{
    NSLog(@"MyTableView (reloadData) self.dataSource: %@, delegate: %@, isMainThread: %d",self.dataSource,self.delegate,[NSThread isMainThread]);

    [super reloadData];

    [self.delegate performSelector:@selector(tableReloaded:) withObject:self];
}

我看到它是从mainthread和datasource调用的,委托永远不会是nil。

我并不好奇为什么tableView不会调用cellForRow,因为它首先必须调用numberOfRows来查看结果> 0.但是,它也没有调用numberOfRows ...

有什么想法吗? tableView给出调用numberOfRows函数的原因是什么?

更新 我已经为reloadData函数添加了新行来打印FullStack以查看它是否是从tableView自己的函数调用的。结果:它们在tableView外部调用,因此它不应该有任何意外行为。

UPDATE2: “有时”:我的用户开始说“有时”他们没有看到表格中的变化后,我发现了这个问题。之后,我尝试连续点击XCode中的运行按钮,直到应用程序打开此错误。 (我运行的30%百分比显示此错误)。当它发生时,直到我重新启动应用程序,reloadData永远不会再次运行。

UPDATE3: 我将self.dataSource==myExpectedViewController[self.dataSource tableView:self numberOfRowsInSection:0]放在一起,看看即使是委托也不是nil,也许是克隆等等。结果是True,numberOfRows正确返回> 0。所以代表是正确的,我有更多的项目而不是零。

UPDATE4: 我尝试了一个新的UITableView(删除我的自定义UITableView),我得到了相同的结果。

Update5: 我在屏幕上放了一个按钮,重新创建表格并设置其代表。每当问题出现问题时,我点击此按钮,一切都开始完美。因此,必须有一些东西打破UITableView的内部,使每次调用reloadData无效,但我仍然找不到它。

1 个答案:

答案 0 :(得分:0)

已编辑:当我在具有此tableview的当前视图控制器上呈现另一个viewcontroller时,我尝试复制该问题并找到了。然后1.尝试用一些数据重新加载这个tableview,并且2.同时解除了我的currentviewcontroller上带有动画的viewcontroller,然后在这个持续时间内,表视图不可见,因此不会重新加载。

要解决此问题,您可以在此处设置延迟或使用该动画的完成块来重新加载表格。

否则问题可能与线程有关,UIElements只能在主线程上更新。

在API调用和其他进程中,我们进入其他线程,我们大多忽略在更新UIElement之前检查我们是否在主线程上。

您应该使用 DispatchQueue.main.async {yourTable.reloadData()} 在主线程中调用yourTable.reloadData(),并确保在主线程上调用它。