2011-08-17 11 views
7

IB要素をNSArrayに編成することが主な目的です。多くの場合、オブジェクトの異なるクラスは、互いに同じ配列になります。forループ - オブジェクト型は無視されますか?

NSArray *array = [NSArray arrayWithObjects:((UITextField *)textField), ((UISegmentedController *)segmentedController), nil]; 

私はときに私のメッセージを「セレクタに応答しません」を取得理由:このは、組織の便利な方法ですが、私はこのような配列を持っている場合、なぜまわりで私の頭を包むように見えることはできませんこのようforループを置く:

for (UITextField *text in array) { 
    [text setText:@""]; 
} 

forループはクラスUITextFieldのないオブジェクトを渡すことのようです。

指定された配列のすべてのオブジェクトがループを通過する場合、オブジェクトのクラスを宣言するポイントは何ですか?

EDITただ、参考のために、これは私が今のようにそれを扱うてる方法です:

for (id *object in array) { 
    if ([object isMemberOfClass:[UITextField class]]) { 
     foo(); 
    } else if ([object isMemberOfClass:[UISegmentedController class]) { 
     bar(); 
    } 
} 
+0

'id'はすでにポインタ型です。 99.9%の時間で、 'id *'へのポインタではなく、単純な 'id'型を使いたいとします。 –

答えて

10

UITextFieldメソッド。

だからではなく、ID型(なし*必要に応じて、ところで)を使用します。

for (id obj in array) 

を次に、あなたがそうであるように型をチェックし、適切なメソッドを呼び出します。

for (UITextField* text in [array filteredArrayUsingPredicate:...]) 

編集:または、その型のみものの行く、特定のタイプのオブジェクトだけを取得するために、配列をフィルタリングし、ここでクラスフィルタ述語を構築する方法は次のとおりです。

Is it possible to filter an NSArray by class?

+0

オブジェクトは新しい型にキャストされません - ポインタはあります。メッセージのディスパッチに関しては、ポインターのタイプは問題ではありません。あなたが望むなら 'NSWindow *'型のポインタを使って '-appendString:'をオブジェクトに送ることができます。ポインタが本当にNSMutableStringのインスタンスを指している限り、うまく動作します。 (コンパイラの警告が出るかもしれませんが、それはうまくいくでしょう)。もしポインタがウィンドウを指しているならば、あなたがそれを防ぐための対策を講じなければ、実行時にエラーが発生します。 – Caleb

+0

あなたはもちろん正しいです、私はそれに応じて私の答えを変更しました。 – SVD

+0

編集が必要な部分は、 "オブジェクトが実際にUITextFieldでない場合、あらゆる種類の奇妙なことが起こるかもしれません..."です。オブジェクトが実際にUITextFieldでない場合は、実装されていないセレクタ例外が発生します。 – Caleb

5

指定された配列内のすべてのオブジェクトが渡された場合、オブジェクトのクラスを宣言する点は何ですかループを通して?

クラス名は、コンパイラに期待するものを知らせるためのものです。これにより、呼び出すメソッドとオブジェクトを扱う方法を把握できます。 intfloatというメソッドに渡すのと同じ考えです。このメソッドはint型を無視しません。正しい型を渡していると仮定しています。このコンストラクションには、それよりももう少しのクレジットが与えられているだけです。

これだけの機能はありません。あなたは今それをどのように扱っているのかは正しい方法です。オブジェクトが実際にUITextFieldのではありませんので、もしあなたが呼び出そうと、奇妙なあらゆる種類のものが起こるかもしれません - あなたは、アレイから

for (UITextField *text in... 

オブジェクトポインタが*タイプのUITextFieldにキャストされているん

0

は確かですを実行したときにエラーが発生しないそのコードは? 「セレクタに応答しない」というメッセージは、実行時エラーであり、コンパイル時エラーではありません。コンパイラは、配列内のオブジェクトに-setText:が実装されているかどうかはわかりませんが、実際にそのメッセージをUISegmentedControlのインスタンスに送信するとエラーが発生するはずです。

もう1つの可能性は、UISegmentedControllerというクラスに-setText:メソッドがあることです。複数部分の棒グラフのようなユーザーインターフェースウィジェットを実装するクラスの名前はUISegmentedControlです。だからあなたが示しているコードは、実際の、テストされたコードではありませんか、または私たちが知らないクラスを持っています。

関連する問題