私は単純なアプリを持っています。そこには都市があり、人々がいる国があります。テーブルビューで国のリストを表示したい。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] を実行する必要があります。私は何か間違ったことをしているのですか、それとも本来の動作方法であり、この近道をとることはできませんか?