8

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

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

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

所以我的问题是:

  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];
}

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

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

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

   // Simulate viewDidLoad method
   [self viewDidLoad];
}
#endif

谢谢

4

1 回答 1

4

这是我发现的:

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

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

于 2012-07-28T15:10:07.673 回答