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