绑定到NSViewController的representObject

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了绑定到NSViewController的representObject相关的知识,希望对你有一定的参考价值。

(摘要:绑定在代码中工作,但在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加载期间被替换为代表对象吗?

答案

我放弃了使用代表对象。它似乎仅适用于模型对象。

我现在使用自定义插座传入我的树形控制器。我继续在代码中设置和拆除绑定。

另一答案

当我尝试将引用传递给对象控制器(在我的情况下为NSTreeController)时,我遇到了类似的问题。我不认为这是Apple希望您使用他们的KVO兼容控制器的方式。例外情况看起来像是XIB-unarchiving和时间相关。

诀窍不是传递控制器,而是传递底层数据并保持选择同步。

这样,您可以在故事板中设置绑定,并且不会出现任何异常。您必须为每个子视图控制器设置一个对象控制器的新实例(在配置第一个工作时,在Storyboard中复制和粘贴)。有关详细示例,请查看another answer that gets much more into detail

以上是关于绑定到NSViewController的representObject的主要内容,如果未能解决你的问题,请参考以下文章

NSViewController 如何避免绑定内存泄漏? [有示例应用程序]

将标签绑定到类的属性

从 NSTableView 获取数据到 NSViewController

如何从 NSViewController 显示视图?

NSViewController 用户界面状态恢复

通过可可绑定将数组与字典连接