2

レシピ用の Core Data ベースの Cocoa アプリを作成しています。Ingredient エンティティがあり、別の Ingredients との Substitutes To Many 関係を作成したいのですが、関係を設定するとき、またはストアを保存するときにエラーが発生し、それがわかりません。エンティティの説明は次のとおりです。

Ingredient
Attributes:
  ingredientName type:String
Relationships:
  ingredientSubstitutes destination:Ingredient inverse:ingredientSubstitutes

私の Nib には、3 つのアレイ コントローラがあります。

  • 全成分AC
  • 利用可能な代用品 AC
  • 厳選された食材代用AC

これらのアレイ コントローラの内容をそれぞれ表示する 3 つのテーブル ビューがあります。次に、ある成分を別の成分の代用として追加するボタンがあり、次のようにバインドされています

Button bindings
Target: All Ingredients AC.selection 
        Selector Name: addIngredientSubstitutesObject:
Argument: Available Substitutes AC.seletion

このセットアップでは、追加ボタンをクリックするとすぐに、アプリは、Ingredient が addIngredientSubstitutesObject を認識しないかのように、「-[_NSControllerObjectProxy エンティティ]: 認識されないセレクタがインスタンスに送信されました」という例外をスローします。認識されないセレクターであることを確認するためにプロキシ メソッドを追加しましたが、それが実際に問題です。

実験として、たくさんのことを試してみてどこにも行かなかった後、私はモデルを変更して、componentSubstitutes が逆にならないようにしました。

Ingredient
Attributes:
  ingredientName type:String
Relationships:
  ingredientSubstitutes destination:Ingredient inverse:*none*

これを実行すると、追加が成功し、それに応じてすべてのテーブルが更新されますが、保存すると、認識されない別のセレクターが取得され、アプリは例外をスローします。

-[_NSControllerObjectProxy _isKindOfEntity:]: 認識されないセレクターがインスタンスに送信されました

何が起こっているのかについての提案はありますか? 私は間違ったアプローチを取っていますか?

4

1 に答える 1

0

それを理解した、このスレッドは私にヒントを与えるのに役立ちました: Core Data Programmatically Adding a to-man Relationship

基本的に、ターゲットを配列コントローラの選択にバインドするということは、ターゲット オブジェクトが、実際の成分ではなく、成分に対する配列コントローラのプロキシオブジェクトであることを意味します。これは明らかに、成分が行う To Many アクセサーに応答しません。代わりに、実際のオブジェクトを取得し、To Many アクセサーを使用できるアプリ デリゲートにメソッドを実装することで、これを解決しました。

- (void)addSubstituteForSelectedIngredient:(OFIngredient *)ingredient
{
  OFIngredient *selectedIngredient = [[self.allIngredientsArrayController selectedObjects] objectAtIndex:0];
  OFIngredient *selectedSubstitute = [[self.availableSubsArrayController selectedObjects] objectAtIndex:0];

  [selectedIngredient addIngredientSubsObject:selectedSubstitute];
}

NSArrayController の - (id) 選択メソッド (元の説明で述べたように、以前に試したもの) はプロキシ オブジェクトを返すため、(NSArray *)selectedObjects を使用する必要があります。

于 2013-09-13T21:38:15.977 に答える