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

Joh*_*mph 8 macos initialization nsviewcontroller ios 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为是,这是一个很好的解决方案吗?:
- (void)initAfterNibLoaded {
   ...
}

- (void)viewDidLoad {
   // Code for ios
   [self initAfterNibLoaded];
}

- (void)awakeFromNib {
   // Code for osx

   // Not sure if necessary
   [super awakeFromNib];

   [self initAfterNibLoaded];
}
Run Code Online (Sandbox Code Playgroud)

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

- (void)viewDidLoad {
   // Initialize after nib loaded
}

#ifndef TARGET_OS_IPHONE
- (void)loadView {
   // Call parent method
   [super loadView];

   // Simulate viewDidLoad method
   [self viewDidLoad];
}
#endif
Run Code Online (Sandbox Code Playgroud)

谢谢

Joh*_*mph 4

这是我发现的:

  1. 是的,awakeFromNib: 也被称为 Lion 中笔尖的文件所有者(通常对于新的 Mountain Lion 来说也是如此)。

  2. NSObject从 OSX 10.6 开始,添加了一个类别awakeFromNib,因此可以安全地[super awakeFromNib]从任何子类调用。对于10.6之前的OSX,我们可以使用 instancesRespondToSelector:来知道父类是否实现了awakeFromNibNSView或者NSObject子类一定不能调用[super awakeFromNib]