设置使用initWithNibName初始化的NSViewController的最佳方法:bundle:?

时间:2012-04-05 12:13:53

标签: ios macos initialization nsviewcontroller awakefromnib

我有一个NSViewController的子类,它从一个nib加载它的视图(使用initWithNibName:bundle:它是该nib的文件所有者)。

我需要在加载nib之后进行一些初始化,并且我希望我的代码最兼容:

  • 在ios中:有viewDidLoad方法可以做到这一点
  • 在osx中​​:在雪豹中,没有像viewDidLoad这样的方法,但是在文件的nib所有者上也调用了awakeFromNib

所以我的问题是:

  1. awakeFromNib是否也调用了Lion中文件的nib所有者?
  2. 如果我使用awakeFromNib,我是否需要调用[super awakeFromNib]? (NSViewController是否实现了awakeFromNib?)
  3. 如果答案1为是,这是一个很好的解决方案吗? :
  4. - (void)initAfterNibLoaded {
       ...
    }
    
    - (void)viewDidLoad {
       // Code for ios
       [self initAfterNibLoaded];
    }
    
    - (void)awakeFromNib {
       // Code for osx
    
       // Not sure if necessary
       [super awakeFromNib];
    
       [self initAfterNibLoaded];
    }
    

    如果答案1为否,这是一个很好的解决方案吗? :

    - (void)viewDidLoad {
       // Initialize after nib loaded
    }
    
    #ifndef TARGET_OS_IPHONE
    - (void)loadView {
       // Call parent method
       [super loadView];
    
       // Simulate viewDidLoad method
       [self viewDidLoad];
    }
    #endif
    

    谢谢

1 个答案:

答案 0 :(得分:4)

这是我发现的:

  1. 是的,awakeFromNib:也会在Lion的nib文件的所有者上调用(通常对于新的Mountain Lion来说也是如此)。

  2. 从OSX 10.6开始,NSObject上有一个类别添加awakeFromNib,因此从任何子类调用[super awakeFromNib]都是安全的。对于10.6之前的OSX,我们可以使用instancesRespondToSelector:来了解父类是否实现awakeFromNibNSViewNSObject子类不能调用[super awakeFromNib]。< / p>