Macos 未调用初始ViewController

Macos 未调用初始ViewController,macos,nsviewcontroller,Macos,Nsviewcontroller,我是一名iOS开发人员,试图了解iOS和MacOS之间的差异 我有一个非常简单的OSX应用程序,它在Yosemite上运行良好,但在Mavericks上,没有调用-viewDidLoad和其他viewController方法,我最终得到了一个空视图 我想我的主要问题是,有什么东西在Mavericks中是不可用的,而在Yosemite中是什么阻止了这样一个基本代码的运行?Mavericks是否可能不像Yosemite那样支持NSViewController 代码如下: - (void)setupV

我是一名iOS开发人员,试图了解iOS和MacOS之间的差异

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

我想我的主要问题是,有什么东西在Mavericks中是不可用的,而在Yosemite中是什么阻止了这样一个基本代码的运行?Mavericks是否可能不像Yosemite那样支持NSViewController

代码如下:

- (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];
}
应用程序是用main menu.xib设置的,其中包含应用程序窗口(以及附加到该窗口的视图,我在上面的代码中替换了该窗口)。还有一个ViewControler.xib,其中包含我的主视图

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


更新:在约塞米蒂之前,NSViewController似乎没有viewDidLoad等。那么,我如何才能最好地实现对Mavericks和Yosemite都有效的东西呢?

在10.10上,
awakeFromNib
似乎不止一次被调用。最好像下面这样检查操作系统版本

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

- (void)viewDidLoad {
    [super viewDidLoad];

    // setup here on 10.10
    ....
}

正如汤姆·安徒生指出的那样,awakeFromNib可以被多次调用。一个更干净的解决方案是覆盖loadView,并在Mavericks和更早版本上调用viewDidLoad

- (void)loadView
{
    [super loadView];

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

在10.9上,
awakeFromNib
是设置的合适位置。@bluedome:works!你为什么不把它写在答案里,我会选对的?你是对的。我会这样做。注意:使用标识符:owner:调用MakeViews会导致在应用程序中多次调用awakeFromNib。这是因为makeViewWithIdentifier:owner:加载一个具有传入所有者的NIB,并且所有者也会收到一个awakeFromNib调用,即使它已经处于唤醒状态。-来自苹果。因此,我在awake from nib中使用了一个简单的标志来取消10.9上的init。如果将
NSViewController
作为对象放入nib文件,并告诉它加载另一个包含它将控制的视图的nib文件(以及它是该nib文件所有者的位置),那么
awakeFromNib
也会被调用两次。当视图控制器本身已加载其NIB文件(以便您可以对其进行编程更改)时,它会被调用一次,当视图控制器已从另一个NIB文件加载其视图后,它会再次被调用,因为只有在您想要初始化这些文件时才会设置
IBOutlets