[tableView reloadData]
不会致电numberOfRowsInSection:(NSInteger)section
如果我看到这样的问题,我会在stackoverflow中写一个答案:
在提出问题之前,我尝试了我的答案。
我将以下行放在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无效,但我仍然找不到它。
答案 0 :(得分:0)
已编辑:当我在具有此tableview的当前视图控制器上呈现另一个viewcontroller时,我尝试复制该问题并找到了。然后1.尝试用一些数据重新加载这个tableview,并且2.同时解除了我的currentviewcontroller上带有动画的viewcontroller,然后在这个持续时间内,表视图不可见,因此不会重新加载。
要解决此问题,您可以在此处设置延迟或使用该动画的完成块来重新加载表格。
否则问题可能与线程有关,UIElements只能在主线程上更新。
在API调用和其他进程中,我们进入其他线程,我们大多忽略在更新UIElement之前检查我们是否在主线程上。
您应该使用 DispatchQueue.main.async {yourTable.reloadData()} 在主线程中调用yourTable.reloadData(),并确保在主线程上调用它。