2011-06-22 4 views
12

initメソッドのオブジェクト(NSButtonのような)に値(つまり、setAlphaValueまたはsetTitle)を設定しようとすると何も起こりませんが、awakeFromNibのsetter関数を呼び出すと正しく動作するのはなぜですか。initとawakeFromNib

@interface appController : NSObject { 
    NSButton *btn; 
} 
@end; 

@implementation appController 
-(void)awakeFromNib { 
    //it works 
    [btn setTitle:@"My title"]; 
} 

-(id)init { 
    self = [super init]; 
    if(self){ 
     //it doesn't works 
     [btn setTitle:@"My title"]; 
    } 
} 
@end 
+0

あなたのボタンはIBOutletですか? – Eimantas

答えて

37

アウトレットは-awakeFromNib-initを設定されています。店舗にアクセスしたい場合は、-awakeFromNibで行うか、店舗を設定した後に実行する別の方法(例:-[NSWindowController windowDidLoad])を行う必要があります。

nibファイルがロードされる:nibファイル内

  1. オブジェクトは、すべての接続が再確立さ-init-initWithFrame:、又は-initWithCoder:
  2. のいずれかを受信し、初期化/割り当てられます。これには、アクション、アウトレット、バインディングが含まれます。
  3. -awakeFromNibは、インターフェイスオブジェクト、ファイルの所有者、およびプロキシオブジェクトに送信されます。

Resource Programming Guideでは、nibローディングプロセスの詳細を読むことができます。

+1

+1は、より高速で長くなります。 :) – Eiko

+0

ありがとう! – MatterGoal

+3

これを追加したいと思います: "nib-loadingコードがawakeFromNibメソッドを呼び出す順序は保証されていません。OS Xでは、Cocoaは次のことを試みます。ファイルの所有者のawakeFromNibメソッドを最後に呼び出しますが、その動作を保証するものではありません。ロード時にnibファイル内のオブジェクトをさらに設定する必要がある場合は、nibローディング呼び出しが復帰した後に、すべてのオブジェクトが作成され、初期化され、使用できる状態になります。この回答の「リソースプログラミングガイド」を参照してください。 –

5

初期状態では、ビューが正しく設定されず、アウトレットが接続されません。そのため、この場合はawakeFromNib:を使用します。すべてがセットアップされ、使用できる状態です。

関連する問題