【问题标题】:Initial ViewController not getting called初始 ViewController 没有被调用
【发布时间】:2015-01-01 21:55:36
【问题描述】:

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

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

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

【问题讨论】:

  • 10.9,awakeFromNib是适合设置的地方。
  • @bluedome:有效!你为什么不把它放在答案中,我会选择它作为正确的答案?
  • 你是对的。我会这样做的。

标签: macos nsviewcontroller


【解决方案1】:

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

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

- (void)viewDidLoad {
    [super viewDidLoad];

    // setup here on 10.10
    ....
}

【讨论】:

  • 注意:调用 makeViewWithIdentifier:owner: 会导致 awakeFromNib 在您的应用程序中被多次调用。这是因为 makeViewWithIdentifier:owner: 使用传入的所有者加载了一个 NIB,并且所有者也收到了一个 awakeFromNib 调用,即使它已经唤醒了。 ——来自苹果。 developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…
  • 所以我在 10.9 上使用 awake 中的一个简单标志来调用一个 off init
  • 如果您将 NSViewController 作为对象放入 NIB 文件中并告诉它加载另一个包含它将控制的视图的 NIB 文件(以及该 NIB 文件的所有者),然后awakeFromNib 也被调用了两次。它在视图控制器本身已加载其 NIB 文件时调用一次(因此您可以对其进行编程更改)并在视图控制器从其他 NIB 文件加载其视图后再次调用它,因为只有 @ 987654326@ 将被设置,以防您也想初始化它们。
【解决方案2】:

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

- (void)loadView
{
    [super loadView];

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多