39

1 つの画面に 2 つのテーブルがあるアプリを作成しています。左の表はフォルダのリスト、右の表はファイルのリストです。左側の行をタップすると、右側のテーブルにそのフォルダーに属するファイルが表示されます。

ストレージには Core Data を使用しています。フォルダーの選択が変更されると、右側のテーブルの NSFetchedResultsController のフェッチ述語が変更され、新しいフェッチが実行され、テーブル データがリロードされます。次のコード スニペットを使用しました。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"list = %@",self.list];
[fetchedResultsController.fetchRequest setPredicate:predicate];
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {   
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}
[table reloadData];

ただし、フェッチ結果は同じままです。フェッチの前後に「述語」を NSLog しましたが、それらは更新された情報で正しかったです。フェッチ結果は、最初のフェッチと同じままです (ビューがロードされたとき)。

Core Data がオブジェクトを取得する方法にはあまり詳しくありませんが (キャッシュ システムはありますか?)、以前に同様のこと (述語の変更、データの再取得、テーブルの更新) を単一のテーブル ビューで行ったことがあり、すべてがうまくいきました。良い。

誰かが私にヒントを与えることができれば、私は非常に感謝しています.

前もって感謝します。

4

4 に答える 4

62

iphone インキュベーターのごく最近のブログ投稿でヒントを見つけるまで、私はほぼこの問題を抱えていました。

NSFetchedResultsController は最初の結果をキャッシュしています。(おそらく、initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName に何かが設定されています)

あなたのコード (私のような) は CoreData サンプルの派生物であると推測しているので、それが @"Root" であると仮定して、述語を変更する前に、

[NSFetchedResultsController deleteCacheWithName:@"Root"];  
于 2010-03-22T11:21:06.947 に答える
3

これは私のために働いた:

[NSFetchedResultsController deleteCacheWithName:nil];  
[self.fetchedResultsController.fetchRequest setPredicate:predicate]; 

NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
    NSLog(@"%@, %@", error, [error userInfo]);
    abort();
} 
于 2016-05-18T08:45:22.363 に答える
2

私の場合、deafgreatdane の答えは機能しません。私が代わりにしたことはおそらく素朴ですが、うまくいきます:

  • メソッドで対応する述語を作成するconfigureCell:atIndexPath:( で呼び出されるtableView:cellForRowAtIndexPath:)
  • 次に呼び出します。
    [_fetchedResultsController.fetchRequest setPredicate:predicate];
    [_fetchedResultsController performFetch:nil];
  • 呼び出して返されたオブジェクトを参照する[self.fetchedResultsController objectAtIndexPath:indexPath]
于 2015-11-02T17:16:47.910 に答える