我曾多次在项目中使用过 NSWindowController,感觉我(非常)粗略地掌握了这个重要类背后的概念。我想用这篇文章来澄清/纠正我自己的理解,并希望能帮助其他学习者迈出理解的第一步。这是我发现最有用的一目了然的概念、概述和最佳实践,但文档中经常缺少这些内容。这是我对 NSWindowController 的看法(问题以粗体散布):
- NSWindowController (NSWC) 子类(概念上)存在于每个窗口 nib 下方,充当用户界面元素和它们控制/表示的模型对象之间的粘合剂。基本上,应用程序中的每个窗口都应该有自己的 NSWC 子类。
- nib 的文件所有者应始终是 NSWC 子类。MainMenu.xib 应用程序也是这样吗?
- NSWC
window
属性应始终链接到 InterfaceBuilder 中的 NSWindow。 - 您应该使用 覆盖“init”方法,
[super initWithWindowNibName:]
以便在您引用[mycontroller window]
它时加载笔尖。MainMenu.xib 窗口的 NSWC 是否也应如此,即使它是在启动时打开的? - NSWC 不应该做太多繁重的工作——它应该简单地将消息传递给对象实例,并在 UI 中呈现这些对象。
- 它可以使用绑定来修改 UI,或者充当表的委托等,或者通过在观察到更改时主动更改 UI 元素,或者以上任何一种的组合(您使用哪个似乎是一个问题味道,各方面都有利弊)。
- NSWC 可以在必要时创建其他 NSWC 的实例(例如,当打开一次性子窗口时)。
使用
[mycontroller showWindow:nil]
可在前面显示关联的窗口。如果您希望窗口显示为工作表,请使用以下内容:NSWindowController* mycontroller = [[MyController alloc] init]; [NSApp beginSheet: [mycontroller window] modalForWindow: [self window] modalDelegate: self didEndSelector: @selector(didEndMySheet:returnCode:contextInfo:) contextInfo: nil];
didEndSelector:
应该是父窗口的NSWC的一个方法,可以通过[sheet windowController]
. - 关闭窗口调用performClose:
NSWC 的窗口的方法。
一些问题:
- MainMenu 窗口的 NSWC 也应该是应用程序委托,还是应该是不同的类?
- 同样,主要 NSWC 应该处理文件(拖放和打开),还是应该将其传递给应用程序委托,或者这只是一个品味问题?
如果这是不好的做法,或者完全是错误的,请纠正我。我希望澄清我对 NSWindowController 的理解,因此任何补充(以最佳实践、经验、陷阱的形式)都将受到高度赞赏。
谢谢,劳里