UITableView 实际上并没有重新加载它的数据,即使数据源方法正在返回新数据
Posted
技术标签:
【中文标题】UITableView 实际上并没有重新加载它的数据,即使数据源方法正在返回新数据【英文标题】:UITableView not actually reloading it's data even though datasource methods are returning the new data 【发布时间】:2011-03-18 16:15:50 【问题描述】:我有一个 tableview 控制器,该表的数据来自 HTTP 请求。当新数据进来时(这应该反映为我表中的新行),但是当我调用时
[self.tableView reloadData]
表格中没有任何变化。没有新行!我的数据源方法中有日志语句,确认在我调用 reloadData 后,表格会询问要绘制多少行和部分。我的控制器肯定会返回应有的新行数,但该表似乎并不关心。我还检查以确保我的 cellForRow... 方法返回了一个正确的单元格实例,该单元格已经配置了正确的数据对象。我以前从来没有遇到过这个问题!
我正在模拟器中运行 ios 4.2,并带有一个为 4.2 构建的 iPad 应用。
【问题讨论】:
我应该补充一点,有时新行确实会出现。不过,新行显示的可能性不到 50%。 Pssst,您可以只编辑您的原始问题,而不是添加 cmets 来澄清。 另外,如果这是一个多线程的东西,this previous SO question may be relevant。 我检查过,对 reloadData 的调用肯定每次都发生在主线程上。甚至确实喜欢建议的那个问题,并明确告诉 tableView 执行SelectorOnMainThread。还是不行。 如果您可以在 bugreporter.apple.com 上提交错误并附加您的项目,那将非常有帮助。确保在此处重新发布错误#。这样,我们可以查看这是 UITableView 的错误,还是您做错了什么。 【参考方案1】:也许您可能有多个 tableview?您可以从 didSelectRowAtIndexPath: 和 cellForRowAtIndexPath: 委托方法打印表的指针。包括你的 self.tableView 的描述也可以对这个问题有所启发。
【讨论】:
好主意。我检查了他们两个,他们总是一样的。希望这是一个像这样的简单修复=/【参考方案2】:听起来像是旧的模型/视图混乱。 reloadData 只会重新显示数据源中已经存在的数据,而不是加载新数据。你可以打电话
[yourFetchedResultsController performFetch:&*error];
每次有新数据可用时,强制立即更新。如您所见,NSFetchedResultsController 将更新其结果,但何时以及多久更新一次取决于它是否有委托以及是否设置了缓存文件名。我引用 NSFetchedResultsController 类参考:
此外, NSFetchedResultsController 提供 以下特点:
它可以选择监控对 在其关联的托管对象 对象上下文,并报告变化 结果集给它的委托(见 “控制器的代表”)。它 可选地缓存其结果 计算使得如果相同的数据 随后被重新展示,作品 不必重复(参见“ 缓存”)。
因此,控制器实际上具有三种操作模式,由它是否具有委托以及是否设置了缓存文件名来确定。
无跟踪:委托设置为 零。控制器只是提供 访问数据,因为它是当 fetch 已执行。
仅内存跟踪:委托是 非零并且设置了文件缓存名称 为零。控制器监控 结果集中的对象和更新 部分和订购信息 响应相关变化。
完全持久跟踪:委托 并且文件缓存名称非零。 控制器监视其对象 结果集和更新部分和 订购信息以响应 相关的变化。控制器 维护一个持久的缓存 其计算结果。
【讨论】:
不。正如我之前所说,我的控制器肯定会在反映新数据的 UITableViewDataSource 方法中返回值,但该表只是不打扰显示新内容。项目的数据以一种奇怪的方式存储,因此控制器对这些数据进行了一些手动排序/存储。我知道模型和视图之间的区别,并且此视图未正确绘制控制器提供的信息。【参考方案3】:您的行高是否 > 0.0? tableView.visibleCells
返回什么?我会验证我的单元格有 hidden != YES
和 frame.size
> (0x0)
【讨论】:
(还要确保你的tableView有hidden == NO
和alpha > 0.0
等。
是的,所有单元格都是可见的。没有任何代码隐藏/缩小它们。以上是关于UITableView 实际上并没有重新加载它的数据,即使数据源方法正在返回新数据的主要内容,如果未能解决你的问题,请参考以下文章
UITableView 无法从 CustomCell 重新加载数据