Tag: nswindowcontroller

NSWindowController澄清理解

我已经多次在项目中使用NSWindowController,并且觉得我对这个重要的类背后的概念有非常粗略的把握。 我想用这个post来做的是澄清/纠正我自己的理解,并希望帮助其他学习者进入理解的第一步。 我发现这些概念,概述和最佳实践是最有用的,而且往往缺less文档。 这里是我对NSWindowController的看法(问题穿插在粗体中): 一个NSWindowController(NSWC)子类存在于(概念上)每个窗口笔尖之下,充当用户界面元素和它们控制/表示的模型对象之间的粘合剂。 基本上,应用程序中的每个窗口都应该有自己的NSWC子类。 笔尖的文件所有者应始终是NSWC子类。 这甚至是MainMenu.xib应用程序的情况吗? NSWC window属性应始终链接到InterfaceBuilder中的NSWindow。 你应该使用[super initWithWindowNibName:]重写'init'方法,这样当你引用[mycontroller window] ,它将加载nib。 对于MainMenu.xib窗口,NSWC是否也应该这样做,即使这是在启动时打开的? NSWC不应该做太多的繁重工作 – 它只是简单地将消息传递给对象的实例,并将这些对象呈现在UI中。 它可以使用绑定来修改用户界面,或者作为表格的委托来进行修改,或者当它观察到一个变化时主动地改变用户界面元素,或者是上述任何一个组合(你使用哪一个似乎是一个问题)口味,各方面都有利有弊)。 NSWC可以在必要时创build其他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] windowController [sheet windowController]访问和释放'mycontroller'。 – closures窗口调用NSWC窗口的performClose:方法。 一些问题: MainMenu窗口的NSWC是否也是应用程序代表,还是应该是不同的类? 同样,NSWC主要处理文件(拖放和打开),还是应该传递给应用程序代表,还是仅仅是一个品味问题? 如果这是不好的做法,请纠正我,或者是错误的。 我期待澄清我对NSWindowController的理解,所以任何补充(以最佳实践,经验,陷阱的forms)将不胜感激。 谢谢,劳里