动态更新UITableView节标题

时间:2011-01-09 16:31:58

标签: iphone ios objective-c uitableview core-data

我想异步下载和更新自定义节标题,但我找不到办法。我目前使用以下方法制作自定义UIView

tableView:viewForHeaderInSection:

我可以从那里同步下载数据,但这会暂时冻结用户界面,这根本不是用户友好的。


更多详情

我的tableview基于Core Data,下载的数据可以存储在我的图像实体的二进制属性中。因此,我检查了是否可以检测到更改,并且有NSFetchedResultsControllerDelegate方法几乎可以执行我想要的操作:

controller:didChangeSection:atIndex:forChangeType:

但不幸的是它不支持节标题更新(仅删除/插入)...

有什么想法吗? 非常感谢你的帮助。

4 个答案:

答案 0 :(得分:11)

你能不能打电话:

- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation
收到新数据并更新CoreData DB后

答案 1 :(得分:5)

如果您使用的是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;
}

应该可以避免你对表格的整个重新加载。

答案 2 :(得分:1)

UITableView reloadSections:withRowAnimation :(甚至reloadData)会起作用,但如果由于其他原因对你不利(因为它不适合我,我不希望当前的文本字段辞职第一响应者),您可以保留对所有headerView的引用,然后在必要时直接更新它们。

答案 3 :(得分:0)

如果您维护/获取指向节标题的指针,并更新它,会发生什么?

此外,当您使用您提到的方法时会发生什么。例如:在controller:didChangeSection:atIndex:forChangeType:中调用tableView:viewForHeaderInSection:(使用表视图和控制器中的部分:didChangeSection :)并根据需要更改视图。