2012-01-24 5 views
0

私のviewController用の.xibファイルがあります。 TableViewとUIViewが含まれています。 UIViewはカスタムクラスであるCommentsBarView(tableViewの下にコメントフィールドがある小さなバーを配置しようとしています)によってサポートされています。私は私のドキュメントアウトラインリストでそうカスタムクラスのIBサブビューのセットアップ/インスタンス化

  1. ビュー
    • のtableView
    • コメントバービュー
      • UITextView
      • UILabel

"comments bar view"のカスタムクラスはCommentsBarViewです。

CommentsBarViewからテキストフィールドとラベルに接続されたアウトレットがあります。 (およびViewControllerからtableViewへ)

私はとコントローラとの私をロードすると:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 

私はのtableViewプロパティにアクセスし、テーブルビューの外観を変更する、しかし、私のcommentsBarView initWithCoderから、私は私のTextViewのテキスト値を設定することはできませんとすることができますラベル:

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

     [self.commentTextView setText:@"Helo, World!"]; 
     [self.characterCountLabel setText:@"200"]; 
    } 

    return self;  
} 

initWithCoder時にはこれらのプロパティが使用できないようです。

自分のコントローラのinitWithNibNameから手動でself.commentsBar.label.text = 200にアクセスしても、問題はありません。

ビューがまだ準備されていないタイミングの問題が発生していますか、viewControllersビュー内にビューをネストすることができず、カスタムUIViewサブクラスによってサポートされていますか?

私は少し混乱しています。

ありがとうございました。

答えて

2

XIBファイルからロードするとき、IBOutletは、アーカイブされていないオブジェクトのメソッドで準備ができていません。

コメントバービューでawakeFromNibをオーバーライドして、準備完了のIBOutletと接続したIBOutletsにアクセスする必要があります。

+0

ありがとう、それはまさに何が起こったかです。 – RickiG

0

いったんIBに慣れると、より良いものになります。 CocoaはMVC(Model-View-Controller)なので、おそらくUIViewサブクラスを作成してUIViewを設定するべきではありません。おそらく、UIViewをUIViewに戻す必要があります。カスタマイズされた外観が必要な場合、私は一般的にUIViewをサブクラス化します。例えば; UIViewをサブクラス化する良い時期は、グラデーションが必要な場合です。次に、グラデーションを表示したいUIViewのサブクラスを再利用することができます。

あなたの場合は、UITextViewとUILabelを「制御」しようとしています。 UITextViewとUILabelのアウトレットをUIViewController(File Owner)に直接ワイヤーアップすることができます。これは、この場合のMVCの「コントローラ」です。 UIViewは、この例の2つのコントロールを保持しているコンテナと考えてください。これで、viewDidLoadメソッドや他のUIViewControllerメソッドを使用して、UITextViewとUILabelの値を設定できます。一般的に、UIVeiwControllerは、CocoaのModelからデータを解釈し、必要な場所にデータを配置します。それは堅実なルールではなく、良いものです。

+0

こんにちは、ロブ、ご返信ありがとうございます。 IBがカスタムビューのグループをカプセル化する可​​能性を提供しなかった場合、私はそれを使用することを決して考えませんでした。私は単純に要素にアクセスするのが早すぎることを示しています。もちろん、viewDidLoadが呼び出される前に、それらの要素を準備する必要はありません。 – RickiG

+0

ありがとうございます。 – Rob

関連する問題