2

我正在为食谱编写一个基于核心数据的 Cocoa 应用程序。我有一个成分实体,并且想要创建一个与其他成分的成分替代品关系,但是在设置关系或保存我无法弄清楚的商店时出现错误。这是实体描述:

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

在我的笔尖中,我有 3 个阵列控制器:

  • 所有成分 AC
  • 可用的替代品 AC
  • 精选成分替代 AC

我有 3 个表视图,每个视图都显示这些数组控制器的内容。然后我有一个按钮来添加一种成分作为另一种成分的替代品,绑定如下

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

使用此设置,只要我单击添加按钮,应用程序就会抛出无法识别的选择器发送到实例异常:“-[_NSControllerObjectProxy 实体]:无法识别的选择器发送到实例”,好像成分无法识别 addIngredientSubstitutesObject。我添加了一个代理方法,以确保这是无法识别的选择器,这确实是问题所在。

在尝试了一堆东西但无处可去之后,作为一个实验,我改变了模型,所以成分替代品没有逆:

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

当我运行它时,添加成功,并且所有表都会相应更新,但是在保存时,我得到了一个不同的无法识别的选择器,并且应用程序抛出了一个异常:

-[_NSControllerObjectProxy _isKindOfEntity:]:无法识别的选择器发送到实例

关于可能发生的事情有什么建议吗?我采取了错误的方法吗?

4

1 回答 1

0

想通了,这个线程帮助我提示:Core Data Programmatically Add a to-many Relationship

基本上,将目标绑定到 Array Controller 的选择意味着目标对象是 Array Controller 的成分的代理对象,而不是实际的成分,它显然不会响应成分所做的 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 回答