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 に答える