「Documents」という名前の多数のエンティティのサブセットを表示するUITableViewがあります。サブセットは、別のエンティティ「選択」によって定義されます。選択範囲には、名前が付けられた、順序付けられたドキュメントのリストがあります。
実行時に表示される選択を変更したい場合を除いて、正常に動作します。空白のリストしか表示されません。
基本的に、新しい述語が別の選択を使用するように、NSFetchedResultsControllerが保持する述語を変更する必要があります。私はそれを機能させることができませんでした。私の最後の試みは、NSFetchedResultsControllerを完全に取り除き、それを再割り当てすることです。
- (void) displaySelection:(Selection *)aSet
{
self.currentSelection = aSet;
self.fetchedResultsController = nil;
// methods here don't all use the property but directly the ivar, so we must trigger the getter
[self fetchedResultsController];
[self.tableView reloadData];
}
そしてもちろん、NSFetchedResultsControllerゲッターは正しいことをします:
- (NSFetchedResultsController *)fetchedResultsController
{
if (fetchedResultsController != nil) { return fetchedResultsController; }
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"DocInSelection" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"selection.identifier like %@", currentSelection.identifier];
[fetchRequest setPredicate:predicate];
<snip>
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
<snip>
return fetchedResultsController;
}
初期選択が設定されているため、このコードは初めて機能します。ただし、がdisplaySelection:
呼び出されると、テーブルビューは空白になります。
NSFetchedResultsControllerフェッチリクエストで非常によく似た質問がありました-述語とUITableViewの更新
そしてその答えは、NSFetchedResultsControllerを取り除くことでした。NSFetchedResultsControllerは、ここに多くの便利な機能(キャッシュ、部分的な読み込みなど)をもたらすため、これは行いたくありません。問題はまだ残っています。NSFetchedResultsControllerに基づくUITableViewのデータを「切り替える」方法です。ここで、「切り替える」とは、別の述語、または(私の場合は)別のエンティティを持つことを意味します。
完全を期すために、選択からドキュメントへの多対多の関係は順序付けられているため、「順序付け」プロパティと2つの多対1を持つDocInSelectionと呼ばれる中間の軽量エンティティを介して処理されることに注意してください。ドキュメントと選択との関係。
提案をありがとう。