2011-08-15 18 views
2

viewDidLoadまたはinitメソッドでUITextFieldのデリゲートを設定することをお勧めしますか? 私はinitメソッドでデリゲートをselfとして設定しようとしましたが、コードをviewDidLoadに移動したときに対応するデリゲートメソッドが呼び出されていませんでした。 誰かが私のためにこれをクリアするのを手伝うことができれば、どちらの方法でも設定できるはずです。どのメソッドでUITextFieldのデリゲートを設定する必要がありますか?

-(id) init { 
    self = [super init]; 
    if (self) 
     textField.delegate = self;  //this text field is an IBOutlet 
     //some other code here as well 
    return self; 
} 

OR

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    textField.delegate = self; 
} 

答えて

3

あなたのテキストフィールドがIBOutletある場合viewDidLoadメソッドが呼び出されるまで、あなたのテキストフィールドがnilになります(したがって、あなたはnilオブジェクトにデリゲートを設定します)。 viewDidLoadが呼び出されると、文字通りビューがロードされ、すべてのIBOutletsとIBActionsが接続され、自由に使用できることを意味します。

+0

完璧な感謝をします、ありがとう。 – SaamJB

1

クラスがUIViewControllerであり、IBOutletを持っているのでNIBからロードされていると仮定すると、オーバーライドする正しいinitメソッドはinitWithCoder:(NSCoder*)decoderです。何が今起こっている:

  1. のiOSは、あなたのnibファイルをロードしてのUIViewControllerは、そのinitWithCoder:(NSCoder*)decoderメソッドを呼び出すことによって作成されたあなたのUIViewController
  2. を作成します。
  3. initWithCoderが最初に行うことは、NBをデコードする前に、init、したがってコードを呼び出すことです。
  4. まだNIBをデコードしていないので、textField IBOutletはまだ設定されていません(デバッグした場合、その値はinitの中にnilであることがわかります)。したがって、デリゲートの設定は何もしません。

最も簡単な方法は、実際にviewDidLoadメソッドでデリゲートを設定することです。 initでは実行できません。しかしinitWithCoderをオーバーライドすることによって行うことができます。

- (id)initWithCoder:(NSCoder*)decoder { 
    self = [super initWithCoder:decoder]; 
    if (self) 
     textField.delegate = self; 
    return self; 
} 

initWithCoderののUIViewControllerの実装は、NIBので、すべてのコンセントが設定されているの復号化を完了するまで、あなたが待つこの時間。

+0

iOS規格に最も適合しているのはどちらですか?デリゲートをviewDidLoadまたはinitWithCoderに設定する必要がありますか? – SaamJB

+0

あなたのアプリケーションがメモリ警告を受け取ってコンセントが失われたときにコントローラのビューがアンロードされる可能性があるので、あなたは 'viewDidLoad'でデリゲートを最も確実に設定するべきです(少なくともviewDidUnload'では設定を解除する必要があります)。 – Eimantas

関連する問題