将 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 与自定义视图一起使用的主要内容,如果未能解决你的问题,请参考以下文章
将 SharedElement Activity 转换与自定义视图一起使用
交换视图 - NSWindowController 和 NSViewController(s)