8

nib からビューをロードする NSViewController のサブクラスがあります (initWithNibName:bundle: を使用し、その 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];
}

答え 1 が NO の場合、これは良い解決策ですか? :

- (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ことができます。NSViewまたはNSObjectサブクラスは を呼び出してはなりません[super awakeFromNib]

于 2012-07-28T15:10:07.673 に答える