我做的第一件事就是把那个窗户撕掉。
我期待看到像 MainWindow.h 和 MainWindow.m 这样的文件从 NSViewController 子类化。
视图控制器不是窗口,窗口也不是视图控制器。
我所做的(在从 MainMenu nib 中删除窗口之后)是创建一个窗口控制器子类,使用 Objective-C 类文件模板并启用“and a nib, too, please”选项(当超类是 NSViewController 或NSWindow 控制器)。
(不要忘记选择 nib 并单击 File Inspector 中的按钮以使其可本地化,因为 Xcode 出于某种原因默认不这样做。)
在子类的实现中,我有如下内容:
@implementation MyWindowController
- (instancetype) init {
return [self initWithWindowNibName:NSStringFromClass([self class])];
}
//and all my app-specific stuff
@end
在应用程序委托中,我删除了曾经引用 MainMenu-born 窗口的插座,然后我创建了窗口控制器:
@implementation MyAppDelegate
{
MyWindowController *_wc;
}
- (void) applicationWillFinishLaunching:(NSNotification *)notification {
_wc = [MyWindowController new];
[_wc showWindow:nil];
}
- (void) applicationWillTerminate:(NSNotification *)notification {
[_wc close];
_wc = nil;
}
@end
(我使用 ARC;如果不使用,则需要在release
其中添加一条消息。)
是否建议将主窗口出口和处理程序放在应用程序委托中?
不,这超出了应用程序的委托应该做的范围。
对于一个极其简单的单窗口应用程序,您可能希望将窗口控制器设置为应用程序的委托。但即使这样也不同于让不是窗口控制器的应用程序委托处理动作、成为数据源等。这是向窗口控制器添加一点责任和向窗口控制器添加大量责任之间的区别。应用委托。
我一直把它们分开。在简单的情况下有点额外的工作,但我的项目更干净,这让我更快乐,而且我通常迟早需要做。