初始 ViewController 未被调用

Initial ViewController not getting called

我是一名 iOS 开发人员,正在尝试了解 iOS 和 MacOS 之间的区别。

我有一个非常简单的 OSX 应用程序,它在 Yosemite 上运行良好,但在 Mavericks 上,-viewDidLoad 和其他 viewController 方法没有被调用,我最终得到空视图。

我想我的主要问题是,有什么在 Mavericks 中不可用而在 Yosemite 中阻止了如此基本的代码运行?有没有可能 Mavericks 不像 Yosemite 那样支持 NSViewControllers?

代码如下:

- (void)setupViewController
{
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    self.window.contentView = self.viewController.view;
    self.viewController.view.frame = ((NSView*)self.window.contentView).bounds;
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // Insert code here to initialize your application
    if (self.viewController == nil)
        [self setupViewController];

    [self.window makeKeyAndOrderFront:self];
}

应用程序设置了一个 MainMenu.xib,其中包含应用程序 Window(以及附加到 window 的视图,我在上面的代码中替换了它)。还有一个 ViewControler.xib 包含我的主要观点。

我该怎么做才能让这个应用程序在 Mavericks 上运行?

更新:看起来 NSViewController 在 Yosemite 之前没有 viewDidLoad 等。那么,我怎样才能最好地实现既适用于 Mavericks 又适用于 Yosemite 的东西?

10.10,awakeFromNib好像被调用了不止一次。最好像下面这样检查 OS 版本。

- (void)awakeFromNib {
    if (![self respondsToSelector:@selector(viewWillAppear)]) {
        // setup here on 10.9
        ....
    }
}

- (void)viewDidLoad {
    [super viewDidLoad];

    // setup here on 10.10
    ....
}

正如 Tom Andersen 所指出的,awakeFromNib 可以被多次调用。一个更简洁的解决方案是覆盖 loadView 并在 Mavericks 和更早版本上自己调用 viewDidLoad。

- (void)loadView
{
    [super loadView];

    if (!self.isOnYosemiteOrLater) {
        [self viewDidLoad];
    }
}