2012-02-17 8 views
1

最近UIViewsとちょっと混乱していますが、この時点までにこれらを使用しています。initの間にIBOutlet UIViewを配列に追加する

私はUIViewControllerを持っていますが、これには5つのビューが含まれています。彼らは簡単に私がviewArrayという配列内にそれらすべてを維持することを決定し維持するようにするには

IBOutlet UIView *view1; 
IBOutlet UIView *view2; 
IBOutlet UIView *view3; 
IBOutlet UIView *view4; 
IBOutlet UIView *view5; 

:私は、実行時にそれらを交換したいと思っていますように私はこれらのビューのためにIBOutletsを作成しました。今、私は次のように配列にビューを追加しようとしています:

viewArray = [NSArray arrayWithObjects:view1, view2, view3, view4, nil]; 

これは私のUIViewControllerクラスのinit関数に呼び出されています。すべてのIBOutletをxib/interfaceファイルの関連するビューにリンクしましたが、初期化されていないようです。さらにデバッグすると、init関数が呼び出されるまでビューが初期化されていないように見えますか?

どうすればこれらのオブジェクトの配列を作成できますか?ビュー自体が表示される前に関連するビューを選択する必要があるため、viewDidLoadはオプションではありません。

私はあなたが物事のタグを取得し、暗黙的に使用してそれらを設定することができることを知っている:

imageExample = (UIImageView *)[self.view viewWithTag:100]; 

しかし、確かに、それは、もともと初期化ビュー内のタグを検索されるように、これは、ビューを見つけるために使用することができます(view1)?高度で任意のヘルプ

おかげで、 種類よろしく、 エリオット

+0

ん 'viewArray = [NSArrayのarrayWithObjects:.mファイルで

NSArray* _viewArray; @property (nonatomic, readonly) NSArray *viewArray; 

:.hファイルで

... '文がコードに表示されますか?あなたの 'init'メソッドですか? – dasblinkenlight

+0

はい、initにあります。 –

+0

私は 'IBOutlet'変数の値が最初にそれらにアクセスする必要がある時までに無限に設定されていると思います。 – dasblinkenlight

答えて

1

あなたはself.viewArrayの代わりに、修飾されていないviewArrayを使用することの価格のため、遅延的viewArrayを初期化することができます。ここで

は、あなたがそれを行うことができる方法である。

-(NSArray*) viewArray { 
    if (!_viewArray) { 
     _viewArray = [NSArray arrayWithObjects:view1, view2, view3, view4, nil]; 
    } 
    return _viewArray; 
} 
+0

self.viewArrayとviewArrayの違いは何ですか?あなたがそれを説明しても大丈夫であれば、このコードはどのように正確に働きますか? –

+0

@ ElliottD'Alvarez 'self.viewArray'はプロパティ構文を使って表現されたメソッド呼び出しです。 'viewArray'はインスタンス変数の参照になります。例えば ​​'self.viewArray objectAtIndex:i 'のようなメソッド呼び出しで' self.viewArray'を参照するたびに、 'viewArray'メソッドが呼び出されます。 _viewArray変数が割り当てられているかどうかをチェックします。最初の回は 'nil'に設定されているので、' if'ステートメント本体が実行され、 '_viewArray'インスタンス変数が設定されます。以降の呼び出しでは、 '_viewArray'は' nil'にならず、呼び出し元に返されます。 – dasblinkenlight

+0

完璧な説明、すべての助けに感謝:) –

関連する問題