我有一个 iOS 应用程序,简而言之,它使用 UITableView 和一些按钮来更改表格的内容。我在开发早期遇到了一个错误,即 reloadData 调用前后的行数不一致,但后来发现我做错了什么。
现在,我从测试人员那里收到一份报告,称他的 iPad 1 崩溃了,通过查看堆栈跟踪,我可以看到发生了与上述相同的错误。但所有其他 iPad 2 测试仪似乎都能正常工作,并且它们都使用相同的数据集来填充表格。
这是我填充表格 View 的方式:
[tableviewController.data removeAllObjects] //Delete the old data. Tableviewcontroller is the delegate for self.tableview
[self.tableview performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
[tableviewController setData:[newDataSetArray mutableCopy]]; //Copy over a new dataset array
[self.tableview performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
如果有人知道为什么会发生这种情况并能指出,我将非常感激。
编辑: 更多细节。听到这个问题后,我们让测试人员删除应用程序的本地副本,并获取最新版本。 此外,他和其他测试人员都运行iOS 5.1.1,所以据我所知,唯一不一致的是硬件版本。但这没有意义:/
最佳答案
我的想法是为什么不这样做:
[tableviewController setData:[newDataSetArray mutableCopy]]; //Copy over a new dataset array
[self.tableview performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
您实际上不需要清除旧的并重新加载,然后设置新的并重新加载。
但是,我会小心线程。看起来这段代码是从非主线程运行的,这意味着表的数据源可能会与数据的设置发生冲突。另一种方法是像这样在主线程上重击所有内容:
dispatch_async(dispatch_get_main_queue(), ^{
[tableviewController setData:[newDataSetArray mutableCopy]]; //Copy over a new dataset array
[self.tableview reloadData];
});
但我也很困惑的是,如果您要重新加载的表格 View 是 self.tableview
,那么 tableviewController
是什么? self
与 tableviewController
不一样吗?
关于objective-c - UITableview 在 reloadData 调用时抛出 "invalid number of rows"错误,但仅适用于 iPad 1 而不是 iPad 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12856561/