私のiPhoneCoreDataアプリでは、マスター/詳細ビューのセットアップで構成しています。
マスタービューは、List
エンティティのオブジェクトを一覧表示するUITableViewです。Listエンティティはエンティティ(「タスク」と呼ばれる)と多対数の関係を持ち、Taskエンティティは「リスト」Task
と呼ばれる逆対1の関係を持ちます。List
マスタービューでオブジェクトが選択されている場合List
、詳細ビュー(別のUITableView)にそのTask
オブジェクトに対応するオブジェクトを一覧表示する必要がありList
ます。私がこれまでに行ったことはこれです:
List
詳細ビューコントローラで、オブジェクトのプロパティを宣言しました。
@property (nonatomic, retain) List *list;
次に、マスタービューコントローラーで、このテーブルビューデリゲートメソッドを使用してlist
、リストが選択されたときに詳細ビューコントローラーのプロパティを設定します。
- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSManagedObject *selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
detailViewController.list = (List*)selectedObject;
}
list
次に、次のように詳細ビューコントローラーのプロパティのセッターをオーバーライドしました。
- (void)setList:(List*)newList
{
if (list != newList) {
[list release];
list = [newList retain];
NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"(list == %@)", list];
[NSFetchedResultsController deleteCacheWithName:@"Root"];
[[[self fetchedResultsController] fetchRequest] setPredicate:newPredicate];
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
}
ここで行っているのは、フェッチされた結果に述語を設定してオブジェクトを除外し、選択したList
オブジェクトに属するオブジェクトのみを取得するようにすることです。詳細ビューコントローラのfetchedResultsControllerゲッタは次のようになります。
- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController == nil) {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Task" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"FALSEPREDICATE"];
[fetchRequest setPredicate:predicate];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
[aFetchedResultsController release];
[fetchRequest release];
[sortDescriptor release];
[sortDescriptors release];
}
return fetchedResultsController;
}
Core Dataプロジェクトテンプレートのデフォルトからほとんど変更されていません。私が行った変更は、常にfalseを返す述語を追加することです。これは、リストが選択されていない場合、アイテムを詳細に表示したくないためです。ビュー(リストが選択されている場合、リストプロパティのセッターで述語が変更されます)。
ただし、リストアイテムを選択しても、実際には何も起こりません。テーブルビューには何も変更されず、空のままになります。私の論理はいくつかの場所で欠陥があると確信しています、アドバイスはありがたいです
ありがとう