【发布时间】:2010-09-10 09:00:15
【问题描述】:
我曾多次在项目中使用过 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]访问和释放'mycontroller'。
- 关闭窗口调用NSWC窗口的performClose:方法。
一些问题:
- MainMenu 窗口的 NSWC 也应该是应用程序委托,还是应该是不同的类?
- 同样,主要 NSWC 应该处理文件(拖放和打开),还是应该将其传递给应用程序委托,或者这只是个人喜好问题?
如果这是不好的做法,或者完全是错误的,请纠正我。我希望澄清我对 NSWindowController 的理解,因此任何补充(以最佳实践、经验、陷阱的形式)都将受到高度赞赏。
谢谢, 劳丽
【问题讨论】:
标签: cocoa nswindowcontroller cocoa-sheet