繁体   English   中英

视图如何在OSX 10.9上加载?

[英]How do views load on OSX 10.9?

我只在OSX 10.10+上进行开发,我希望我的应用程序在10.9和10.10+上均可使用。 我遇到的问题是viewDidLoad()仅在10.10+上可用。 如何灵活地使用视图和视图控制器来在两者上工作?

通过查看源代码,看起来我需要重写init吗? 但是,当覆盖init:nibName:nibBundleOrNil:时,它也需要init:coder,这对我来说没有多大意义(在源代码中未记录)。

在10.10之前,NSViewController基本上什么都不做(这是NSWindowController所做的大部分工作);)在10.10上,它获得了与iOS世界类似的方法(viewDidLoad ...),并且一件非常重要的事情最终被自动放入NSResponder中。链(NSApp sendAction:...将检查viewController是否具有该方法)。

那么如何获得功能呢?

  1. 使用awakeFromNib
  2. 手动将视图添加到响应者链(如果使用10.10 SDK进行编译,则该视图会自动添加到10.10及更高版本;如果使用10.9 SDK进行编译,则必须手动添加)
  3. 使用XIB; 您不能使用情节提要->它们使用10.10 nsviewcontrollers->死角

因此,如果使用情节提要板,则需要进行大量工作。 如果您没有干净的MVC / MVVM架构,那么就不值得了。

另一种选择是将您的班级pre10.10和after10.10加倍,但这意味着要解雇两次相同的代码(一次使用故事板,一次使用XIB)。

编辑:

如@geowar建议,您可以覆盖loadView。 请注意,您仍然无法使用情节提要,您必须手动将viewController添加到responseerChain

- (void)loadView
{
    [super loadView];

    // if we're running on 10.8 or older…
    if (NSAppKitVersionNumber <= NSAppKitVersionNumber10_8) {
        [self viewDidLoad]; // call viewDidLoad (added in 10.9)
    }
}

另外

- (void)setView:(NSView*)view {
    super.view = view;
    // if we're running on 10.8 or older…
    if (NSAppKitVersionNumber <= NSAppKitVersionNumber10_8) {
        [self viewDidLoad]; // call viewDidLoad (added in 10.9)
    }
}
@end

EDIT2:

在loadView之后调用awakeFromNib(它将从xib获取新视图并将其实例化)。 正如@ Daij-Djan所建议的,另一种解决方案是覆盖setter。

给在NSViewController中寻找-viewWillLoad和-viewDidLoad方法的人的建议

即使NSWindowController具有-windowWillLoad和-windowDidLoad方法供您覆盖Mac OS 10.5中引入的NSViewController类,也没有对应的-viewWillLoad和-viewDidLoad方法。 您可以重写-[NSViewController loadView]以自定义在视图控制器完成笔尖加载之前或之后立即发生的事情。

在此处输入图片说明

使您在10.9上等于10.10编写这样的VC

@interface MyViewController : NSViewController 
@end

@implementation MyViewController 
- (void)setView:(NSView*)v {
    super.view = v;
    // if we're running on 10.8 or older…
    if (NSAppKitVersionNumber <= NSAppKitVersionNumber10_8) {
        [self viewDidLoad]; // call viewDidLoad (added in 10.9)
    }
}
@end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM