0

CoreDataTableViewController(スタンフォード クラス) のサブクラスである UITableViewController があります。を実装しfetchedResultsControllerます。

今、私の中にviewWillAppear、私はこれを持っています:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    if(!self.managedObjectContext) {
        [self useManagedDocument];
    }
}

managedObjectContext持っていない場合は初期化し、ヘルパークラスから取得します。MOC セッターで、以下を初期化しますfetchedResultsController

- (void)setManagedObjectContext:(NSManagedObjectContext *)managedObjectContext
{
    _managedObjectContext = managedObjectContext;

    if(self.managedObjectContext) {
        NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:CD_ITEM_ENTITY_NAME];
        request.sortDescriptors = @[[NSSortDescriptor
                                     sortDescriptorWithKey:CD_ITEM_NAME_PROPERTY
                                     ascending:YES
                                     selector:@selector(localizedCaseInsensitiveCompare:)]];
        request.predicate = nil;
        self.fetchedResultsController = [[NSFetchedResultsController alloc]
                                         initWithFetchRequest:request
                                         managedObjectContext:self.managedObjectContext
                                         sectionNameKeyPath:nil
                                         cacheName:nil];
    } else {
        self.fetchedResultsController = nil;
    }

}

プログラムが起動すると、テーブル データが正しく読み込まれ、デバッガーはフェッチ要求が行われたと表示します。ただし、Core Data グラフにデータを挿入して保存すると、コンテキストが変更され、次のデリゲート メソッドが起動されます。

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    /*NSError *error;
    [controller performFetch:&error];
    if(error) {
        NSLog(@"%@", error);
    }
    [self.tableView reloadData];*/
}

うまくいかなかったのでコメントしました。基本的に、私がやりたいことは、コンテキストが変わるたびにデータをリロードすることです。別のView Controllerにアイテムを追加してからこのView Controllerに戻ると、その場合もリロードする必要があります。

これを実装するにはどうすればよいですか?performFetch私はそのデリゲートメソッドでやってみましたが、それに入りました(内部にブレークポイントを設定してチェックしました)が、performFetch何もせず、テーブルがリロードされませんでした。

モーダル VC (アイテムを管理するための別の VC) にアイテムを追加すると、ロガーで次のようになります。

2013-05-10 22:41:38.264 App1[7742:c07] [ItemCDTVC performFetch] fetching all Item (i.e., no predicate)
2013-05-10 22:41:46.454 App1[7742:c07] NSManagedObjects did change.
2013-05-10 22:41:46.456 App1[7742:c07] NSManagedContext did save.

アプリを閉じても、マルチタスク バーから終了せずに再度開いても、何もしません。フェッチなし。コンテキストが変更されていない場合は、リクエストを発行したくありませんが、ユーザーが別の ViewController にアイテムを追加してから、すべてのアイテムを一覧表示する ItemCDTVC に戻ったとします。デリゲート メソッドを呼び出してテーブルを更新できるように、コンテキスト変更通知を受け取りますviewWillAppearか? 現在、アプリのロード時に一度だけ実行するように設定しています。

4

1 に答える 1

0

修正しました。私がしなければならなかったのは、そのデリゲート メソッドに 1 つのライナーを配置することだけです。

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView endUpdates];
}

これにより、 Appleのドキュメントと同じように、テーブルに加えられた更新、挿入、削除、および変更(基本的にビューを更新)が終了します。

コンテンツの変更時に更新されるようになりました。

于 2013-05-10T22:20:53.200 に答える