使用NSFetchedResultsControllerDelegate更新TableView部分& NSPredicate更改后的行

时间:2011-01-01 14:12:57

标签: iphone nsfetchedresultscontroller nspredicate uisearchbardelegate

有没有办法在更改fetchedResultsControllers NSpredicate(并执行提取)后更新UITableView节和行?当searchBar中的searchText发生变化时,我想使用controllerWillChangeContent委托方法来更新我的表。

目前在我的应用程序中,只有在coredata发生更改时才会调用这些委托方法。不是在更改resultsController谓词和&执行提取。

如果我只是在每个文本转换上调用[self.tableView reloadData],那么就没有动画,它会阻止这种体验。

或者我应该做一些完全不同的事情来更新每个搜索文本条目更改的tableView内容吗?

4 个答案:

答案 0 :(得分:8)

我已经对Apple的文档进行了另一次研究,看起来当谓词发生变化时,不会调用NSFetchedResultsControllerDelegate方法:

  

一个实例   NSFetchedResultsController使用   本协议中的方法通知其   委托控制器的提取   由于一个结果已经改变   添加,删除,移动或更新   操作

所以,回答我自己的问题:在NSFetchedResultsController谓词发生变化后,不可能使用NSFetchedResultsControllerDelegate来更新表。

答案 1 :(得分:0)

尝试在

中拨打[self.tableView reloadData]
-(void)viewWillAppear:(BOOL)animated;
                 or
-(void)viewDidAppear:(BOOL)animated;

答案 2 :(得分:0)

您可以尝试使用UITableView方法reloadSections:withRowAnimation:传递NSIndexSet所有部分。这样你应该重新加载整个东西,但仍然可以选择你想要的动画。

如果要添加和删除行,则需要使用insertSections:withRowAnimation:removeSections:withRowAnimation:。如果您一次进行了大量更改,则还应在调用beginUpdatesendUpdates之间进行更改。

答案 3 :(得分:0)

来自NSFetchedResultsController类参考:

  

修改获取请求

     

您不能简单地将获取请求更改为   修改结果。如果你想   更改获取请求,您必须:

     

如果您使用缓存,请将其删除   (使用deleteCacheWithName :)。   通常,您不应使用缓存   如果您要更改提取请求。

     

更改提取请求。调用   performFetch:

由于您已更改谓词,因此必须再次调用performFetch:然后委托将处理从那里更新表。