0

ロード時に項目の alloc/init を呼び出したため、ビューがカスタム ビューからのすべてのデリゲート呼び出しを無視するという非常に奇妙な問題を目の当たりにしました。その理由が気になります。

@synthesize customTextField;

-(void)viewDidLoad {
   // by calling this alloc/init, none of the changes here actually update to the view
   // everything is ignored from here on in.
   // if I comment out the alloc/init line, everything works fine
   self.customTextField = [[UITextField alloc] init];
   self.customTextField.text = @"Some text";
   // setting font and size as well

}

テキスト フィールド デリゲート メソッドへの呼び出しは引き続き取得されますが、特定のテキスト フィールドにリンクされるものはありませんでした。だけでは対応できませんでしたcustomTextField

alloc/init を呼び出すとcustomTextField... の完全に新しいインスタンスが得られることはわかっていますが、その新しいインスタンスが IB とビューにリンクされないのはなぜですか?

4

3 に答える 3

2

viewDidLoadnib がロードされた後に呼び出され、この時点で新しい UITextField インスタンスを作成しても nib には関連付けられません。新しいインスタンスを手動でセットアップする場合は、デリゲートも手動でセットアップし、それらをビューのサブビューとして追加する必要があります。

于 2012-07-22T23:56:59.343 に答える
2

なぜならIB linking != binding

IB で変数をリンクすると、最初のロード時に変数を 1 回設定するだけです。正当な理由により、変更を追跡するための他の特別なコードはありません。

例えば:

を設計しUITableViewCellていて、セルが選択されている場合は、セル内のすべてのコンテンツを再配置する必要があります。この場合、すべてのサブビューを再作成してビューに再度追加する方が簡単だと判断したので、次の手順を実行します。

-(void) layoutSubviews {
    if (cellIsSelected)
    {
        // custom button is an IBOutlet property, which is by default a subview of self
        self.customButton = [UIButton buttonWithType:UIButtonTypeCustom];

        [[self someSubView] addSubview:customButton];
    }
    else {
         // where is customButton located now? is it a subview of self or `someSubView`?
         self.customButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];

         // [self addSubview:customButton];
    }
}

したがって、IB がlet's set this once, and let the programmer figure the rest outオブジェクトに加えられたすべての変更を追跡して UI に報告するよりも、IB が言う方がはるかに簡単です。

于 2012-07-22T23:55:47.670 に答える
1

XIB ファイルには、参照を変更していることを知る方法がありません。次のコードを検討してください

NSObject *myObjA = [[NSObject alloc]init]; //create object
NSObject *myObjB = myObjA; //assign reference <- this is the your case after xib load 
myObjB = [[NSObject alloc]init]; //create object, myObjA still lives on.

基本的には、XIB ファイルをロードするときと同じです。インスタンス化されたオブジェクトへの参照を取得します (上記の例では myObjB に相当)。参照を使って好きなことを行うことができますが、新しいオブジェクトを作成するだけでインターフェイス インスタンスを変更することはありません。

于 2012-07-22T23:59:51.883 に答える