2

ビューコントローラ(タブ1)で、次のようにコアデータからロードします。

- (void)loadRecordsFromCoreData {

[self.managedObjectContext performBlockAndWait:^{
    NSError *error = nil;
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Item"];
    [request setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"order" ascending:YES]]];

    self.items = [self.managedObjectContext executeFetchRequest:request error:&error];

}];
}

次に、次のようなアイテムを表示します(viewDidAppearに):

- (void)displayItems
{
for(UIView *subview in [self.itemRow subviews]) {
    [subview removeFromSuperview];
}

int xPos = kXItemOffsetIphone;

for (Item *item in self.items) {
    ItemView *itemView = [[ItemView alloc] initWithFrame:CGRectMake(xPos, kYItemOffsetIphone, kItemWidthIphone, kItemHeightIphone) ];

    [itemView layoutWithData:item];

    [self.itemRow addSubview:itemView];

    xPos += kXItemSpacingIphone;
}

}

ItemViewは、アイテムなどに関連付けられた画像を表示するUIViewサブクラスです。アプリを最初に実行すると、すべてのアイテムが表示されます。ただし、別のタブをクリックしてからタブ1に戻ると、すべてのアイテムが表示されなくなります。アイテム配列はまだ存在しますが、配列内の各アイテムは「障害」であるため、何も表示されません。とてもイライラします。これらのアイテムが「障害」になるのを防ぐにはどうすればよいですか?

4

1 に答える 1

4

割り当てが解除されているようNSManagedObjectContextです(タブを切り替えると、View Controllerがアンロード/クリーンアップされている可能性がありますか?)。

舞台裏では、オブジェクトはSQLiteストアに出入りするデータのプロキシであり、によって管理されるキャッシュ間を移動しますNSManagedObjectContext。コンテキストの割り当てが解除されても、プロキシオブジェクトはまだ存在しますが(したがって、アレイがオブジェクトでいっぱいになっている理由)、割り当てが解除された管理対象オブジェクトコンテキストにデータを要求することはできず、すべての値が障害に戻ります。

いくつかのオプションがあります。

コントローラ間を移動するときに参照を渡すことができるので、参照をNSManagedObjectContext失うことはありません。

-viewWillAppear:ビューが表示されるたびに起動される便利な別の方法でデータを再フェッチできます。

NSManagedObjectContextアプリケーションの存続期間中に存在するシングルトンオブジェクトに移動することもできますが、注意しないと脆弱になる可能性があります。

于 2012-09-11T23:55:02.497 に答える