绑定到 NSViewController 的代表对象

Posted

技术标签:

【中文标题】绑定到 NSViewController 的代表对象【英文标题】:Binding to a NSViewController's representedObject 【发布时间】:2009-10-03 17:00:55 【问题描述】:

(摘要:绑定在代码中起作用,但在 IB 中不起作用)

我有一个由 NSWindowController 管理的窗口。窗口左侧是源视图。右侧是一个表格视图,显示当前选定源的元素。

我已经在我的窗口 XIB 中设置了一个 NSTreeController。我希望它的内容用于源视图。它的选择将驱动表格视图。

我正在尝试使用 NSViewControllers 将其拆分。一个视图控制器将加载一个包含源视图的 NIB。另一个视图控制器将加载表格视图。

看到我需要访问源视图控制器中的 NSTreeController,我将它设置为视图控制器的代表对象。 (实际上,要在视图控制器上调用 awakeFromNib 时完成此设置,我已将代表对象转换为 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 重现这一点。问题是,这里的“控制器键”文本字段是灰色的。因此,我使用“representedObject.arrangedObjects.title”的模型 keyPath 将列的“值”绑定到文件所有者。这没有显示所需的行为。实际上是抛出异常:-[NSProxy doesNotRecognizeSelector:_mutatingNodes] called!

如何在 IB 中使用代表对象? 我可以在 IB 中创建一个控制器来充当代表对象的代理吗? 我可以在源视图 XIB 中设置一个树控制器,在 NIB 加载期间它被替换为代表对象吗?

【问题讨论】:

【参考方案1】:

我不再使用代表对象。这似乎仅适用于模型对象。

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

【讨论】:

【参考方案2】:

当我尝试将引用传递给对象控制器(在我的情况下为NSTreeController)时,我遇到了类似的问题。我不认为这就是 Apple 希望你使用他们的 KVO 兼容控制器的方式。这些异常看起来与 XIB 取消归档和时间相关。

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

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

【讨论】:

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

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

将标签绑定到类的属性

如何从app delegate访问NSViewController?

从 NSTableView 获取数据到 NSViewController

如何从 NSViewController 显示视图?

NSViewController 用户界面状态恢复