动态更新 UITableView 部分标题
Posted
技术标签:
【中文标题】动态更新 UITableView 部分标题【英文标题】:Updating UITableView section headers dynamically 【发布时间】:2011-01-09 16:31:58 【问题描述】:我想异步下载和更新自定义部分标题,但我找不到方法。我目前通过以下方法自定义UIView
s:
tableView:viewForHeaderInSection:
我可以从那里同步下载数据,但这会暂时冻结 UI,这对用户来说根本不友好。
更多详情:
我的 tableview 是基于 Core Data 的,下载的数据可以存储在我的图像实体的二进制属性中。因此我检查了是否可以检测到更改,并且有一个NSFetchedResultsControllerDelegate
方法几乎可以满足我的要求:
controller:didChangeSection:atIndex:forChangeType:
但不幸的是,它不支持节标题更新(仅删除/插入)...
有什么想法吗? 非常感谢您的帮助。
【问题讨论】:
【参考方案1】:你能不能直接打电话:
- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation
在您收到新数据并更新 CoreData DB 之后。
【讨论】:
谢谢 Linasses,我不敢相信我忽略了这个方法。它确实解决了我的问题。 请注意,在您使用它时,这将胜过该部分中的任何其他表格动画。我在这个 7896719 上有一个与苹果有关的错误。最好只需调用刷新页眉或页脚 @BrentPriddy 关于该错误报告的任何消息?我刚刚遇到了同样的问题:表格动画看起来既可爱又流畅,但调用 reloadSections 会破坏它 - 以某种方式刷新标题会很棒。 7896719 是真正的问题,我的被关闭为重复...所以我无法告诉你真正的问题 7896719 的状态。【参考方案2】:如果您使用 FetchedResultsControllers,也是一个选项:
在子程序中:
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
在某处添加这一行(假设您已经在标题中声明了变量...):
sectionToUpdate = newIndexPath.section;
然后在:
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
在最后添加类似这样的内容:
if (sectionToUpdate != -1)
[yourtableview beginUpdates];
[yourtableview reloadSections:[NSIndexSet indexSetWithIndex:sectionToUpdate] withRowAnimation:UITableViewRowAnimationFade];
[yourtableview endUpdates];
sectionToUpdate = -1;
应该让您免于重新加载表格。
【讨论】:
如果在单个 Fetched Results 更新周期中插入了多个部分,并且在所有更新完成后屏幕上显示了多个这些更新的部分,则此方法可能会失败。这是因为只有最后更改的部分会被重新加载。在您尝试为更改的部分创建索引集之前,让我说没有任何意义。在表格上调用 reloadData() 会重新加载屏幕上的所有单元格。重新加载所有可见部分将具有完全相同的视觉效果。诀窍是避免重复保存到 MOC,以便一次完成所有更新。【参考方案3】:UITableView reloadSections:withRowAnimation:(甚至 reloadData)会起作用,但如果由于其他原因这对您不利(因为它不适合我,我不希望当前文本字段辞职第一响应者),您可以保留对所有 headerViews 的引用,然后在必要时直接更新它们。
【讨论】:
【参考方案4】:如果您维护/获取指向节标题的指针,然后更新它,会发生什么?
另外,当您使用您提到的方法时会发生什么。例如:在controller:didChangeSection:atIndex:forChangeType:
中调用您的tableView:viewForHeaderInSection:
(使用表视图和控制器中的部分:didChangeSection:)并根据需要更改视图。
【讨论】:
controller:didChangeSection:atIndex:forChangeType 方法仅在插入或删除部分时被调用,因此我显然无法在我的情况下使用它。我将尝试实现一个 NSDictionary,它保留对这些标题视图的引用(sectionNb 作为键,headerView 作为值)。是不是像你建议的那样?以上是关于动态更新 UITableView 部分标题的主要内容,如果未能解决你的问题,请参考以下文章
当我动态更改其框架时,即使重新加载后 UITableView 内容大小也不会更新