3

私の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を返す述語を追加することです。これは、リストが選択されていない場合、アイテムを詳細に表示したくないためです。ビュー(リストが選択されている場合、リストプロパティのセッターで述語が変更されます)。

ただし、リストアイテムを選択しても、実際には何も起こりません。テーブルビューには何も変更されず、空のままになります。私の論理はいくつかの場所で欠陥があると確信しています、アドバイスはありがたいです

ありがとう

4

3 に答える 3

1

NSFetchedResultsControllerタスクリストにを設定する必要はありません。Listエンティティを渡すので、Listエンティティにタスクを要求できます。

NSSet *tasks = [[self list] valueForKey:@"tasks"];
NSSortDescriptor *sort = ...;
NSArray *sorted = [[tasks allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];
[self setTasks:sorted];

次に、その配列UITableviewDatasourceからメソッドを実行します。tasks

于 2010-03-27T14:28:15.343 に答える
0

たぶん私はあなたのセットアップを完全には理解していませんが

detailViewController.list.task

(またはその関係が呼び出されるものは何でも)Listオブジェクトに関連付けられているすべてのTaskオブジェクトのNSSetを返します。

于 2010-03-27T05:10:21.237 に答える
0

同様の問題があり、UITableViewのNSFetchedResultsController(またはその述語)をプログラムで切り替える方法に質問を投稿しました。

投稿した後、あなたのコードを試してみることにしました。そして、あなたは何を知っていますか?ほんの少しの追加で動作します:

    [self.tableView reloadData];

おそらく、最初のコードに戻って確認することができます。

よろしく。

于 2010-08-16T14:59:16.153 に答える