9

UIViewnibファイルからビューを取り込むカスタムを作成しようとしています。

私のコントローラーには、次のようなものがあります。

self.arcView=[[JtView alloc] initWithCoder:self];
self.arcView.backgroundColor=[UIColor redColor];
self.arcView.frame=CGRectMake(30.0f,200.0f, 100.0f, 100.0f);
[self.view addSubview:self.arcView];

私の最初の質問は、何を議論するべきかということinitWithCoder (NSCoder *)です。私は自分自身を試しましたが、互換性のないポインタ型を取得しましたが、これは機能しているようです。しかし、質問2に移ります。

第二に、引数は、カスタムビューをフレームに配置するときに使用initWithCoderすることです。さて、カスタムビューにをロードしてからフレームに入れたいと思います。上記のようにフレームを追加するだけで大​​丈夫ですか(動作しているように見えます)?nibsinitWithFramenib

4

4 に答える 4

9

initWithCoderずっと前に呼び出されinitviewDidLoadメソッド。そして、あなたはそれを決して呼びません。からnibファイルをロードすると呼び出されますmainBundle

ただし、NSCoder引数として受け取ります。クラスでどのように呼び出されるかを確認します。

- (id)initWithCoder:(NSCoder *)aDecoder {
    if ((self = [super initWithCoder:aDecoder])) {
        [self baseClassInit];
    }
    return self;
}

- (void)baseClassInit {

    //initialize all ivars and properties    
}
于 2013-03-01T03:25:59.650 に答える
8

あなたはそれを逆にやっています:それを呼び出すのはあなたではなくinitWithCoder:、それを行うのはメソッドの実装ですloadNibNamed:owner:

コードで行う必要があるのは、

UIView *view = [[[NSBundle mainBundle] loadNibNamed:@"theNIB" 
                                              owner:self 
                                            options:nil] objectAtIndex:0];

これにより、NIBのバンドルが解除され、initWithCoder:初期化子が呼び出され、すべてのコンセントが接続された状態でビューが返されます。

于 2013-03-01T03:26:07.433 に答える
1
self.arcView = [[[NSBundle mainBundle] loadNibNamed:@"JtView" owner:self options:nil] objectAtIndex:0];
self.arcView.frame = CGRectMake(30.0f,200.0f, 100.0f, 100.0f);
self.arcView.backgroundColor = [UIColor redColor];
[self.view addSubview:self.arcView];

それは機能し、を呼び出さないでくださいinitWithCoder:

于 2013-03-01T03:45:41.540 に答える
1

initWithCoderを明示的に呼び出さないでください。アーカイブされたオブジェクトをアーカイブ解除し、オブジェクトのivarとプロパティを初期化するときに暗黙的に呼び出されます。アーカイブオブジェクトは、永続ストレージに保存されたカスタムモデルクラス、またはxibファイルからロードされたカスタムビューにすることができます。

クラスでは、カスタムビューを作成しようとしているように見えるので、xibファイルからロードします。参照用に@dasblinkenlightコードは完璧なソリューションです。

于 2017-11-08T16:44:55.717 に答える