(摘要:绑定在代码中起作用,但不在IB中起作用)
我有一个由NSWindowController管理的窗口。窗口左侧是源视图。右侧是一个表格视图,显示当前所选源的元素。
我在我的窗口XIB中设置了一个NSTreeController。我希望它的内容用于源视图。它的选择将驱动表视图。
我正在尝试使用NSViewControllers将其拆分。一个视图控制器将加载包含源视图的NIB。另一个视图控制器将加载表视图。
看到我需要访问源视图控制器中的NSTreeController,我已将其设置为视图控制器的representObject。 (实际上,要在视图控制器上调用awakeFromNib时完成此设置,我已将representObject转换为IBOutlet)。
当我在代码中连接源视图时,一切正常:
[outlineView bind:@"content"
toObject:sources
withKeyPath:@"arrangedObjects"
options:nil];
[outlineView bind:@"selectionIndexPaths"
toObject:sources
withKeyPath:@"selectionIndexPaths"
options:nil];
[[outlineView tableColumnWithIdentifier:@"Title"] bind:@"value"
toObject:sources
withKeyPath:@"arrangedObjects.title"
options:nil];
但是我无法使用Interface Builder重现这一点。事情是,这里“控制器键”文本字段显示为灰色。因此,我使用“representObject.arrangedObjects.title”的模型keyPath将列的“值”绑定到文件所有者。这并未显示所需的行为。实际上抛出了异常:-[NSProxy doesNotRecognizeSelector:_mutatingNodes] called!
如何在IB中使用representObject? 我可以在IB中创建一个控制器作为代表对象吗? 我可以在源视图XIB中设置一个树控制器,在NIB加载过程中,它会被替换为代表对象吗?
答案 0 :(得分:2)
我离开了使用代表对象。它似乎仅适用于模型对象。
我现在使用自定义插座传入我的树形控制器。我继续在代码中设置并拆除绑定。
答案 1 :(得分:0)
当我尝试将引用传递给对象控制器(在我的情况下为NSTreeController
时),我遇到类似的问题。我认为这不是Apple希望您使用其KVO兼容控制器的方式。例外看上去与XIB取消存档且与时间相关。
诀窍是 不是 来传递控制器,而是传递基础数据并使选择保持同步 。
通过这种方式,您可以在情节提要中设置绑定,并且不会出现任何异常。您必须为每个子视图控制器设置一个对象控制器的新实例(配置第一个视图控制器后,将其复制并粘贴到Storyboard中)。有关详细示例,请查看another answer that gets much more into detail。