我想异步下载和更新自定义节标题,但我找不到办法。我目前使用以下方法制作自定义UIView
:
tableView:viewForHeaderInSection:
我可以从那里同步下载数据,但这会暂时冻结用户界面,这根本不是用户友好的。
更多详情:
我的tableview基于Core Data,下载的数据可以存储在我的图像实体的二进制属性中。因此,我检查了是否可以检测到更改,并且有NSFetchedResultsControllerDelegate
方法几乎可以执行我想要的操作:
controller:didChangeSection:atIndex:forChangeType:
但不幸的是它不支持节标题更新(仅删除/插入)...
有什么想法吗? 非常感谢你的帮助。
答案 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 :)并根据需要更改视图。