[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];
}
我看到它是从主线程和数据源调用的,并且委托永远不会为零。
我对为什么 tableView 不调用 cellForRow 并不好奇,因为它首先必须调用 numberOfRows 来查看结果是否 > 0。但是,它也不调用 numberOfRows ......
有任何想法吗?tableView 放弃调用 numberOfRows 函数的原因是什么?
更新: 我已经在 reloadData 函数中添加了新行来打印 FullStack 以查看它是否是从 tableView 自己的函数中调用的。结果:它们在 tableView 之外被调用,因此不应该有任何意外行为。
Update2: “有时”:在我的用户开始说“有时”他们看不到表中的更改后,我发现了这个问题。之后,我尝试在 XCode 中连续点击运行按钮,直到应用程序打开时出现此错误。(我运行的 30% 的百分比显示此错误)。当它发生时,直到我重新启动应用程序,reloadData 永远不会再次工作。
更新 3:
我输入self.dataSource==myExpectedViewController
并[self.dataSource tableView:self numberOfRowsInSection:0]
查看是否甚至代表不为零,也许他们正在被克隆等。结果是 True 并且 numberOfRows 正确返回> 0。所以代表是正确的,我有比零更多的项目。
Update4: 我尝试了一个新的 UITableView(删除了我的自定义 UITableView),我得到了相同的结果。
Update5: 我在屏幕上放置了一个按钮,用于重新创建表格并设置其代表。每当问题中的问题发生时,我点击这个按钮,一切都开始完美运行。所以,一定有一些东西破坏了 UITableView 的内部结构,它使每次调用 reloadData 都无效,但我仍然找不到它。