我正在使用Xcode 4.6.3,并且我使用“Cocoa Application”模板创建了一个新项目。默认结构对我来说似乎有点滑稽,我想知道它是否是推荐的结构。
具体而言,模板创建的三个文件是:
MainMenu.xib
AppDelegate.h
AppDelegate.m
MainMenu.xib
文件包含主菜单定义和主窗口的定义。在名为MainMenu.xib
的文件中定义主窗口对我来说似乎很奇怪。 这是定义主窗口的推荐位置吗?
我希望看到来自MainWindow.h
的{{1}}和MainWindow.m
子文件。从模板创建的当前结构将引导我为app委托中的主窗口事件创建处理程序。这对我来说也很奇怪。 是否建议将主窗口和处理程序放在应用代理中?
答案 0 :(得分:2)
我做的第一件事就是撕掉那扇窗户。
我希望看到像MainWindow.h这样的文件,以及从NSViewController中继承的MainWindow.m文件。
视图控制器不是窗口,窗口不是视图控制器。
我所做的(在从MainMenu笔尖删除窗口之后)创建一个窗口控制器子类,使用Objective-C类文件模板并启用“和一个笔尖,请”选项(当超类是NSViewController或NSWindowController时出现)。
(不要忘记之后选择笔尖并单击文件检查器中的按钮以使其可本地化,因为Xcode由于某种原因默认不这样做。)
在子类的实现中,我有以下内容:
@implementation MyWindowController
- (instancetype) init {
return [self initWithWindowNibName:NSStringFromClass([self class])];
}
//and all my app-specific stuff
@end
在app delegate中,我删除曾经引用MainMenu生成窗口的插座,然后创建窗口控制器:
@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
消息。)
是否建议将主窗口和处理程序放在app delegate中?
没有。这超出了应用程序代表应该做的范围。
对于极其简单的单窗口应用程序,您可能希望将窗口控制器设置为应用程序的委托。但即使这与制作不是窗口控制器的应用程序委托处理动作,数据源等不同。这是在向窗口控制器添加一点责任并添加大量责任之间的区别。应用代表。
我始终将它们分开。在简单的情况下,这是一项额外的工作,但我的项目更清洁,这让我更快乐,我通常需要迟早这样做。