1

次のエラーが発生しました:

2012-04-18 10:15:49.585 FoodXJournal[13931:fb03] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'CommodityTypes''

私はこの主題に関する他の質問のほとんどを読み、いくつかのチェックを行いました。

静的テーブルビューを含む詳細ビューコントローラがあります。テーブルビューの1つのセルには「削除」というラベルが付けられ、「deleteCT」という名前のセグエにリンクされています。このセルがタップされたときにアプリを削除self.detailItemしてマスタービューコントローラーにセグエしたい。これが私の方法です。すべてのNSLog行は、これをデバッグするためのものです。

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"deleteCT"]) {
        if (![self.detailItem.myCommodities count]) {
            NSLog(@"Testing");
            NSLog(@"myCommodities is empty:%@", [self.detailItem.myCommodities count]);
            NSLog(@"self.detailItem HAS a context:%@", [self.detailItem managedObjectContext]);
            NSLog(@"self.detailItem is of CommodityTypes:%@", [[self.detailItem entity] name]);
            NSLog(@"self.detailItem has a managed object model:%@", [[self.detailItem entity] managedObjectModel]);
            [[self.detailItem managedObjectContext] deleteObject:self.detailItem];
        }
    }
}

これがログです。私はこの方法に入ります、

2012-04-18 10:15:49.544 FoodXJournal[13931:fb03] Testing

削除の条件を満たしています、

2012-04-18 10:15:49.544 FoodXJournal[13931:fb03] myCommodities is empty:(null)

エラーメッセージには「が」と表示されますが、コンテキスト'+entityForName: could not locate an NSManagedObjectModel for entity name 'CommodityTypes'があります。self.detailItem

2012-04-18 10:15:49.545 FoodXJournal[13931:fb03] self.detailItem HAS a context:<NSManagedObjectContext: 0x6d7e740>

はい、self.detailItem私が考えているエンティティタイプは次のとおりです。

2012-04-18 10:15:49.546 FoodXJournal[13931:fb03] self.detailItem is of CommodityTypes:CommodityTypes

そして、はい、そのエンティティタイプ(NSLog(@"self.detailItem is of CommodityTypes:%@", [[self.detailItem entity] name]);)には管理対象オブジェクトモデルがあります。

管理対象オブジェクトモデルの説明は非常に長いため、ここではその最初の部分のみを示しています。

2012-04-18 10:15:49.565 FoodXJournal[13931:fb03] self.detailItem has a managed object model:(<NSManagedObjectModel: 0x6d73250>) isEditable 0, entities {
Accounts = "(<NSEntityDescription: 0x6d71120>) name Accounts, managedObjectClassName Accounts, renamingIdentifier Accounts, isAbstract 0, superentity name Grandparent, properties {\n    \"account_1\" = \"(<NSAttributeDescription: 0x6d6e9d0>), name account_1, isOptional 1, isTransient 0, entity Accounts,

下にスクロール:

CommodityTypes = "(<NSEntityDescription: 0x6d71240>) name CommodityTypes, managedObjectClassName CommodityTypes, renamingIdentifier CommodityTypes, isAbstract 0, superentity name Grandparent, properties {\n    myCommodities = \"(<NSRelationshipDescription: 0x6d701f0>), name myCommodities, isOptional 1, isTransient 0, entity CommodityTypes, 

CommodityTypes管理対象オブジェクトモデルで定義されます。

では、なぜ[[self.detailItem managedObjectContext] deleteObject:self.detailItem];クラッシュするのですか?!?

self.detailItemprepareForSegue内で削除できない理由はありますか?セルまたはラベルにアクションを割り当ててから、プログラムでセグエを呼び出す必要がありますか?

4

1 に答える 1

3

ユーレカ!ありがとうございます!新しい管理対象オブジェクトを作成するメソッドから来たものではありませんでしたが、あなたのアイデアに戻って、その行の直前と直後に一連のブレークポイントを使用する必要がありました. NSEntityDescription *entity = [NSEntityDescription entityForName:@"CommodityTypes" inManagedObjectContext:self.managedObjectContext];マスターテーブルビューで絞り込みました。起動時に、アプリ デリゲートは管理オブジェクト コンテキストを設定し、それをマスター ビューに渡します。詳細ビューからマスター ビューの NEXT INSTANCE に移動するときに、必ずしも元のインスタンスに戻るとは限らないことを忘れていました。管理対象オブジェクトのコンテキストを次のビュー コントローラーに渡す必要があります。

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"deleteCT"]) {
        if (![self.detailItem.myCommodities count]) {

            CommodityTypes * thisItem = self.detailItem;
            NSManagedObjectContext * thisContext = [thisItem managedObjectContext];
            FoodXCommodityTypesMasterViewController * nextView = [segue destinationViewController];

            [thisContext deleteObject:thisItem];

            nextView.managedObjectContext = thisContext;

        }
    }
}

これで動作します。

于 2012-04-18T22:47:19.290 に答える