Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 如何在Interface Builder中绑定1:many关系_Xcode_Cocoa_Xcode4_Cocoa Bindings - Fatal编程技术网

Xcode 如何在Interface Builder中绑定1:many关系

Xcode 如何在Interface Builder中绑定1:many关系,xcode,cocoa,xcode4,cocoa-bindings,Xcode,Cocoa,Xcode4,Cocoa Bindings,我有一个简单的核心数据应用程序,用于建模对象:员工和笔记。员工可以有很多笔记(1:many),每个笔记属于一个员工(1:1)。在employee窗口中,我使用NSArrayController显示文件中员工的列表(NSTableView)。单击员工会在列表旁边显示其详细信息(姓名、地址、性别等)。现在,我还想显示所选员工的文件注释列表(也是NSTableView)。该列表应显示文件中每个注释的两个属性:主题和输入日期) 我尝试执行以下操作:(1)将表的日期列绑定到员工控制器,控制器键:选择,模型

我有一个简单的核心数据应用程序,用于建模对象:员工和笔记。员工可以有很多笔记(1:many),每个笔记属于一个员工(1:1)。在employee窗口中,我使用NSArrayController显示文件中员工的列表(NSTableView)。单击员工会在列表旁边显示其详细信息(姓名、地址、性别等)。现在,我还想显示所选员工的文件注释列表(也是NSTableView)。该列表应显示文件中每个注释的两个属性:主题和输入日期)

我尝试执行以下操作:(1)将表的日期列绑定到员工控制器,控制器键:选择,模型键路径:notes.date(2)绑定员工控制器的主题列,控制器键:选择,模型键路径:notes.topic

但是,这会引发异常(无法识别的选择器)

如何将员工的notes属性正确绑定到NSTableView?是否可以使用IB中的cocoa绑定“直接”完成,或者在设置绑定之前,是否需要额外的代码来访问员工的notes属性?我检查了由Core data编写的数据,这看起来都很好

非常感谢你的帮助

编辑:这是来自调试器的堆栈跟踪

编辑2:

似乎还有另一个问题与底层模型有关。员工的备注通过单独的窗口输入,该窗口有自己的控制器。它创建新注释并允许用户设置其属性(主题、正文)。当用户按下“保存”按钮时,将执行saveNote方法:

- (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];