如何在OSX 10.9上加载视图?

时间:2015-10-12 21:04:03

标签: macos swift cocoa osx-mavericks

我只是在OSX 10.10+上开发,我希望我的应用程序可以在10.9和10.10+上运行。我遇到的问题是viewDidLoad()仅适用于10.10+。如何灵活地查看和查看控制器以同时使用它们?

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

2 个答案:

答案 0 :(得分:0)

在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 - >死路一条
  4. 因此,如果您使用故事板,那么它需要做很多工作。如果你没有干净的MVC / MVVM架构,那么它就不值得。

    替代方法是在10.10之前和10.10之后加倍你的类,但这意味着将相同的代码放置两次(一次使用故事板,一次使用XIB)。

    编辑:

    正如@geowar建议您可以覆盖loadView。请注意,您仍然无法使用故事板,您必须手动将viewController添加到responderChain

    - (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。

      

    为寻找-viewWillLoad和-viewDidLoad的人提供建议   NSViewController中的方法

         

    即使NSWindowController有-windowWillLoad和-windowDidLoad   用于覆盖引入的NSViewController类的方法   Mac OS 10.5没有相应的-viewWillLoad和-viewDidLoad   方法。您可以覆盖 - [NSViewController loadView]进行自定义   在nib加载完成之前或之后立即发生的事情   由视图控制器。

    getBoundingClientRect

答案 1 :(得分:0)

让你在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