我有一个简单的应用程序,我有拥有城市的国家,而这些城市又有人。我想在表格视图中显示国家/地区列表。我使用NSFetchedResultsController来获取所有数据。这是设置:
-(void)initializeFetchedResultsController
{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Country"];
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]];
fetchRequest.fetchBatchSize = 30;
self.fetchResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:[NSManagedObjectContext managedObjectContext]
sectionNameKeyPath:@"nameFirstLetter"
cacheName:nil];
self.fetchResultsController.delegate = self;
[self.fetchResultsController performFetch:nil];
}
我还通过在搜索栏中输入国家/地区名称添加了搜索功能,因此我实现了UISearchBarDelegate方法:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if([searchText isEqualToString:@""])
{
self.fetchResultsController.fetchRequest.predicate = nil;
}
else
{
self.fetchResultsController.fetchRequest.predicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH[cd] %@", searchText];
}
[self.fetchResultsController performFetch:nil];
[self.tableView reloadData];
}
这可行,但不是我想要的方式。我期望在谓词更改时,我的NSFetchResultsControllerDelegate委托方法将再次被调用,因此我可以从我的表视图中插入或删除项目/部分(我想要动画),而不必弄清楚自己,已添加和删除的内容。但事实并非如此,相反,如果我更改谓词,则不会调用委托方法,我必须做一个简单的[self.tableView reloadData]。我做错了什么,或者只是它应该如何工作,我不能采取这种捷径?
答案 0 :(得分:5)
你做错了。这就是它的方式,没有捷径可走。您必须实现自己的代码,以便在提取之间为表视图设置动画。
答案 1 :(得分:4)
正如@StianHøiland所说,你需要自己做。通常使用委托方法,它们会因为“离线”/异步更改而被调用,以便通知您。它们不会因您明确要求的更改而被调用。
您可以考虑使用FRC的fetchedObjects
和indexPathForObject:
功能。过滤fetchedObjects
列表(使用谓词)。获取已删除对象的索引路径,然后可以为它们设置动画。