2

我使用的是 Xcode 4.6.3,并使用“Cocoa Application”模板创建了一个新项目。默认结构对我来说似乎有点有趣,我想知道它是否是推荐的结构。

具体来说,模板创建的三个文件是:

  • MainMenu.xib
  • AppDelegate.h
  • AppDelegate.m

MainMenu.xib文件包含主菜单定义,以及主窗口的定义。将主窗口定义在一个名为MainMenu.xib. 这是定义主窗口的推荐位置吗?

我期待看到一个类似的文件MainWindow.h,并MainWindow.mNSViewController. 从模板创建的当前结构将引导我为应用程序委托中的主窗口事件创建处理程序。这对我来说也很奇怪。是否建议将主窗口出口和处理程序放在应用程序委托中?

4

1 回答 1

2

我做的第一件事就是把那个窗户撕掉。

我期待看到像 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其中添加一条消息。)

是否建议将主窗口出口和处理程序放在应用程序委托中?

不,这超出了应用程序的委托应该做的范围。

对于一个极其简单的单窗口应用程序,您可能希望将窗口控制器设置为应用程序的委托。但即使这样也不同于让不是窗口控制器的应用程序委托处理动作、成为数据源等。这是向窗口控制器添加一点责任和向窗口控制器添加大量责任之间的区别。应用委托。

我一直把它们分开。在简单的情况下有点额外的工作,但我的项目更干净,这让我更快乐,而且我通常迟早需要做。

于 2013-06-22T21:39:48.763 回答