将 NSViewController 与自定义视图一起使用

Posted

技术标签:

【中文标题】将 NSViewController 与自定义视图一起使用【英文标题】:Use NSViewController with Custom View 【发布时间】:2016-04-25 17:04:26 【问题描述】:

我有一个主 .xib 视图,其中的一部分由自定义视图组成。同时,我还创建了单独的 .xib 子视图(连同它们各自的 .h 和 .m 文件)。然后将这些自定义类连接到主 .xib 中的自定义视图

此设置工作正常,但我希望有多个 NSViewController(s) 控制每个不同的自定义视图。推荐的方法是什么?

例如。 Main.xib > 包含“自定义视图” > 每个都使用 NSView 自定义类并在它自己的.xib 中设计

NSViewController 类将响应发生在这些自定义视图之一中的事件,而不是绑定到 Main.xib 的 NSViewController

【问题讨论】:

我认为您可以通过子类化 NSViewController 并将所需数量的新视图控制器放置在主 xib 文件中来实现这一点(就像应用程序委托一样)。然后,您可以在窗口中以图形方式将它们与关联的自定义视图挂钩,并让它们在 awakeFromNib 上加载自己的关联 xib。您可以通过主视图控制器上的插座来保留这些子控制器 【参考方案1】:

我最终使用 XIB 文件而不是我之前的自定义视图创建了 NSViewControllers。

然后我为我拥有的每个自定义视图创建了 NSBox 组件。我通过 IBOutlet(s) 将它们中的每一个连接到主 NSViewController。

最后,我通过 IBOutlets 将每个自定义视图附加到专用的 NSBox,如下所示:

- (void) awakeFromNib
   [super awakeFromNib];


    //instantiate custom view controller
   CustomViewController* customViewController = [[CustomViewController alloc] initWithNibName:@"CustomViewController"
                                                  bundle:nil];
   [self.customNSBoxView setContentView:[customViewController view]];

【讨论】:

【参考方案2】:

我倾向于做的只是创建一个新的NSViewController 子类并选择“创建 XIB”选项。

从那里,我实例化视图控制器子类并将其添加到代码中的视图层次结构中。

这并不完全符合您的建议,但它确实使事情更加模块化/更易于测试。缺点是在父子之间设置约束具有挑战性。我也倾向于手动执行此操作,或者将子控制器的视图添加到 NSStackView 中,这会给您一些限制。

可能有更好的方法,但这是我们在 multi-xib 项目中使用的方法。

【讨论】:

这正是我们在这个项目之前所拥有的,但是正如您所提到的,它使得在 Interface Builder 中设置视图之间的约束变得更加困难。

以上是关于将 NSViewController 与自定义视图一起使用的主要内容,如果未能解决你的问题,请参考以下文章

NSViewController 和界面生成器

将 SharedElement Activity 转换与自定义视图一起使用

如何从 NSViewController 显示视图?

交换视图 - NSWindowController 和 NSViewController(s)

绑定到NSViewController的representObject

在 Forms UWP 中,自定义标题视图中的内容视图的后退导航无法与自定义渲染器一起正常工作