8

私のコードでコアデータに裏打ちされた NSArrayController を正しく動作させるのに問題があります。以下は私のコードです:

pageArrayController = [[NSArrayController alloc] initWithContent:nil];
    [pageArrayController setManagedObjectContext:[self managedObjectContext]];
    [pageArrayController setEntityName:@"Page"];
    [pageArrayController setAvoidsEmptySelection:YES];
    [pageArrayController setPreservesSelection:YES];
    [pageArrayController setSelectsInsertedObjects:YES];
    [pageArrayController setClearsFilterPredicateOnInsertion:YES];
    [pageArrayController setEditable:YES];
    [pageArrayController setAutomaticallyPreparesContent:YES];
    [pageArrayController setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"index" ascending:YES]]];
    BOOL result = [pageArrayController setSelectionIndex:0];

setSelectionIndex: を呼び出そうとすると、選択が正常に変更されたことを示す YES が返されます。ただし、その後の pageArrayController オブジェクトへの getSelectionIndex 呼び出しでは、NSNotFound が返されます。

私が理解していないのは、NSArrayController を NIB に配置し、NIB ファイルが初期化を実行できるようにすると (Interface Builder ですべて同じ属性を使用して)、NSArrayController が正しく動作することです。

行動に違いがあるのはなぜですか?NIB ファイルは、これらのタイプのオブジェクトを特別な方法で初期化しますか? NSArrayController の初期化は間違っていますか?

どんな助けでも大歓迎です。ありがとう。

4

3 に答える 3

16

はい、ペン先は特別な方法でオブジェクトを初期化しますが、それを複製する方法を理解するのが難しい場合があります。私もこれに苦労し、最終的に Apple のコア データ プログラミング ガイド >> コア データと Cooca バインディング >>自動的にコンテンツ フラグを準備する ( Cocoa Devリストの Dave Fernandes に感謝) で答えを見つけました。答えは、nil コンテンツで arraycontroller を初期化する場合、フェッチも実行する必要があるということです。

BOOL result;
NSArrayController *pageArrayController = [[NSArrayController alloc] initWithContent:nil];
[pageArrayController setManagedObjectContext:[self managedObjectContext]];
[pageArrayController setEntityName:@"Page"];
NSError *error;
if ([pageArrayController fetchWithRequest:nil merge:YES error:&error] == NO) 
     result = NO;
else
{
     //do all that other pageArrayController configuration stuff
     result = [pageArrayController setSelectionIndex:0];
}

ところで、 [NSSortDescriptor sortDescriptorWithKey:@"index" 昇順:YES]] は警告を発します。

于 2009-12-07T20:25:35.887 に答える
0

アレイコントローラーをどこから作成/構成していますか? Core Data スタックはまだ準備ができていない可能性があるため、[self managedObjectContext] への呼び出しが nil を返す可能性があります。

また、Interface Builder で問題なく作成できるのに、なぜプログラムで作成するのですか? このツールはそこにあり、適切に機能します (そして、多くの可能性のあるコーディング エラーを排除します)。そのため、使用しない正当な理由がない限り、あなたは何の恩恵も受けていません。

于 2009-12-07T20:24:07.067 に答える