动态更新 UITableView 部分标题

Posted

技术标签:

【中文标题】动态更新 UITableView 部分标题【英文标题】:Updating UITableView section headers dynamically 【发布时间】:2011-01-09 16:31:58 【问题描述】:

我想异步下载和更新自定义部分标题,但我找不到方法。我目前通过以下方法自定义UIViews:

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 内容大小也不会更新

动态更新 UIProgressView 的进度

UITableView 部分标题与 UITableviewCell 重叠并且没有背景颜色

UITableView 动态部分

更新变量时动态刷新模板的一部分golang

在 UITableView 页脚中动态设置和调整标签大小