初始ViewController没有被调用

时间:2015-01-01 21:55:37

标签: macos nsviewcontroller

我是iOS开发人员,正在尝试了解iOS和MacOS之间的差异。

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

我想我的主要问题是,在小牛队中有什么不可用,并且在优胜美地中可以防止这样一个基本的代码操作?小牛队有可能不像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设置,其中包含应用程序窗口(以及附加到该窗口的视图,我在上面的代码中替换了该视图)。还有一个ViewControler.xib,它包含我的主视图。

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

UPDATE :在优胜美地之前,看起来NSViewController没有viewDidLoad等。那么,我如何才能最好地实现适用于小牛队和优胜美地的东西?

2 个答案:

答案 0 :(得分:2)

在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
    ....
}

答案 1 :(得分:0)

正如汤姆安德森所指出的,可以多次调用awakeFromNib。一个更干净的解决方案是覆盖loadView并在Mavericks和更早版本上自己调用viewDidLoad。

- (void)loadView
{
    [super loadView];

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