2

我有一个简单的应用程序,我的国家有城市,而城市又会有人。我想在表格视图中显示国家列表。我使用 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]。我是在做错什么,还是只是它应该工作的方式,我不能走这条捷径?

4

2 回答 2

5

你没有做错。事情就是这样,没有捷径可走。您必须实现自己的代码以在获取之间为表格视图设置动画。

于 2013-10-10T13:19:23.383 回答
4

正如@StianHøiland 所说,您需要自己动手。通常使用委托方法,它们作为“离线”/异步更改的结果被调用,以通知您。它们不会因为您明确请求的更改而被调用。

您可以考虑使用 FRC 的fetchedObjectsindexPathForObject:功能。过滤fetchedObjects列表(使用您的谓词)。获取已删除对象的索引路径,您可以为它们设置动画。

于 2013-10-10T13:23:55.740 回答