2013-03-01 14 views
9

私はnibファイルからビューを持ち込むカスタムUIViewを作成しようとしています。は、initWithCoderとカスタムUIViewsについて混乱しています

私のコントローラでは、私のようなものがあります:

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に:

第2に、カスタムビューをフレームに入れるときにinitWithCodernibsinitWithFrameを使用するという議論があります。さて、私はカスタムビューでnibをロードし、それをフレームに入れたいと思います。上記のようにフレームを追加するだけでいいですか(それはうまくいくようです)?

+0

ここをクリックしてコードサンプルを見てください。stackoverflow.com/a/17798646/381807 - nesimtunc – nesimtunc

答えて

9

:それはinitWithCoder:を呼び出す必要がありますありません、それはそれをしないloadNibNamed:owner:メソッドの実装です。あなたのコードで行う必要がありますどのような

これはNIBをアンバンドルし、あなたのinitWithCoder:初期化子を呼び出して、接続されているすべてのアウトレットとの見解をあなたに戻って与えるだろう

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

を呼んでいます。

+0

このメソッドはNIBのすべてのトップレベルオブジェクトのNSArrayを返しませんか? 'UIView'が最初でない場合はどうなりますか? – borrrden

+0

thx、これを今作業しています。私は別の質問をしました(スパムには申し訳ありませんが、これを理解しなければならないと感じています)。 – timpone

9

initWithCoderは、initおよびviewDidLoadの方法のかなり前と呼ばれている。あなたは決してそれを呼ぶことはありません。 mainBundleからnibファイルを読み込むと呼び出されます。

ただし、引数としてNSCoderを受け取ります。それはクラスで呼び出されるか確認してください:あなたは周りにそれを他の方法を行っている

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

- (void)baseClassInit { 

    //initialize all ivars and properties  
} 
+0

これは正しいアイデアのようです。 – timpone

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:を呼び出しません。

1

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

あなたのクラスでは、カスタムビューを作成しようとしているようですので、xibファイルからロードしてください。@ dasblinkenlightコードは完全な解決策です。

関連する問題