Xcode 如何在Interface Builder中绑定1:many关系
我有一个简单的核心数据应用程序,用于建模对象:员工和笔记。员工可以有很多笔记(1:many),每个笔记属于一个员工(1:1)。在employee窗口中,我使用NSArrayController显示文件中员工的列表(NSTableView)。单击员工会在列表旁边显示其详细信息(姓名、地址、性别等)。现在,我还想显示所选员工的文件注释列表(也是NSTableView)。该列表应显示文件中每个注释的两个属性:主题和输入日期) 我尝试执行以下操作:(1)将表的日期列绑定到员工控制器,控制器键:选择,模型键路径:notes.date(2)绑定员工控制器的主题列,控制器键:选择,模型键路径:notes.topic 但是,这会引发异常(无法识别的选择器) 如何将员工的notes属性正确绑定到NSTableView?是否可以使用IB中的cocoa绑定“直接”完成,或者在设置绑定之前,是否需要额外的代码来访问员工的notes属性?我检查了由Core data编写的数据,这看起来都很好 非常感谢你的帮助 编辑:这是来自调试器的堆栈跟踪 编辑2: 似乎还有另一个问题与底层模型有关。员工的备注通过单独的窗口输入,该窗口有自己的控制器。它创建新注释并允许用户设置其属性(主题、正文)。当用户按下“保存”按钮时,将执行saveNote方法:Xcode 如何在Interface Builder中绑定1:many关系,xcode,cocoa,xcode4,cocoa-bindings,Xcode,Cocoa,Xcode4,Cocoa Bindings,我有一个简单的核心数据应用程序,用于建模对象:员工和笔记。员工可以有很多笔记(1:many),每个笔记属于一个员工(1:1)。在employee窗口中,我使用NSArrayController显示文件中员工的列表(NSTableView)。单击员工会在列表旁边显示其详细信息(姓名、地址、性别等)。现在,我还想显示所选员工的文件注释列表(也是NSTableView)。该列表应显示文件中每个注释的两个属性:主题和输入日期) 我尝试执行以下操作:(1)将表的日期列绑定到员工控制器,控制器键:选择,模型
- (IBAction)saveNote:(id)sender {
[[self note] setValue: [[self topicField] stringValue] forKey: @"topic"];
[[self note] setValue: [[self textView] string] forKey: @"bodyText"];
[[self note] setValue: [self employee] forKey: @"employee"];
NSError *error = nil;
if (![[self managedObjectContext] save:&error]) {
//todo: add proper error handling
NSLog(@"An error occurred while trying to save the memo");
}
[[self window] close];
}
当我逐步使用此方法时,在设置便笺和员工之间的关系时(第3行),实际上会生成异常。您需要的是一个NSArrayController,其内容绑定到该关系。然后将NSTableView内容绑定到NSArrayController。从那里你可以做专栏 更新
这可能会对您有所帮助。我的问题中描述的行为似乎与使用基于文档的核心数据应用程序或“普通”核心数据应用程序(在XCode中创建新项目时进行的检查)有关 我发现,当我选择基于文档的核心数据应用程序时,上述问题不会发生。当我开发与非文档核心数据应用程序相同的应用程序时,绑定notes控制器会生成堆栈跟踪,如我的原始问题所示,并且在我向现有员工添加注释时会立即引发异常
因此,平心而论,这只是解决方案的一部分,因为我对Cocoa和XCode的经验不足以解释为什么它不能使用非基于文档的变体。您不绑定表视图的内容。当您绑定列时,它会自动绑定。您自己绑定表视图的内容会导致问题。感谢您提供本教程的链接。这很有帮助!是 啊谢谢你的指导!“无法识别的选择器”并不意味着“你刚才所做的一切都是错误的”;这意味着“你做的这件非常具体的事情是错误的”。消息的其余部分详细介绍了这一点。请编辑您的问题以包含它。我已将堆栈跟踪添加到问题中。我尝试了几种方法来实现这一点,还尝试将ArrayController绑定到notes属性。这不起作用。notes属性包含NSSet实例,而ArrayController需要NSArray。另外,正如您在下面的评论中指出的,显然不能将表直接绑定到数组。从堆栈跟踪来看,我猜您是将数组控制器绑定到NSSet属性(IIRC是核心数据中通常存在的关系)。请确保您绑定了它的
contentSet
,而不是它的contentArray
。好的,谢谢。当我设置新便笺和员工之间的关系时,似乎还潜藏着另一个问题,这显然导致了异常。。。(我在问一个问题…不太确定这是否是正确的网站礼仪。如果不是的话,我道歉)这是相同的例外,具有相同的堆栈跟踪吗?如果是,那么你可能已经取得了进展,但这个问题仍然没有解决。如果没有,那么这应该是一个新问题。
- (IBAction)saveNote:(id)sender {
[[self note] setValue: [[self topicField] stringValue] forKey: @"topic"];
[[self note] setValue: [[self textView] string] forKey: @"bodyText"];
[[self note] setValue: [self employee] forKey: @"employee"];
NSError *error = nil;
if (![[self managedObjectContext] save:&error]) {
//todo: add proper error handling
NSLog(@"An error occurred while trying to save the memo");
}
[[self window] close];