2011-07-21 20 views
3

ここで簡単な質問:テキストフィールドを見つけるためにサブビューを列挙する正しい方法はどれですか?iPhone:UITextFieldsで列挙する方法

NSMutableArray *mutableTFs = [[NSMutableArray alloc] init]; 

for (UIView *view in [self.view subviews]) { 
    if ([view isKindOfClass:[UITextField class]]) {    
     [mutableTFs addObject:view]; 
    } 
} 

OR

NSMutableArray *mutableTFs = [[NSMutableArray alloc] init]; 

for (UITextField *textField in [self.view subviews]) { 
    [mutableTFs addObject:textField]; 
} 

私はこれが正しい言葉遣いではないですけど、それはトップの方法であればどのような私は理解していないことは、どのように「変換」ビューからそれを行うれますテキストフィールドに?

+0

あなた前の質問は[こちら](http://stackoverflow.com/questions/6753108/uitextfield-questions-input-accessory-and-enumeration)の場合には、誰もが興味を持っています。 – bshirley

+0

"ビューからテキストフィールドに変換する方法は?" - UITextFieldはUIViewを継承しているため、すべてのUITextFieldはUIViewです。あなたはそれをUIViewに変換せず、キャストして、UIViewのどのメソッドもこのオブジェクトで動作することをコンパイラに伝えます。以下の修正された関数を使用して、オブジェクトに対して反復処理を行う際にUITextFieldメソッドを使用する場合は、2番目のアプローチが必要です。ポストにあるものを使用しないでください。P – ColdLogic

答えて

10

最初の方法が正しいものです。 2番目の方法は、タイプUITextFieldのサブビューだけでなく、すべてのサブビューを繰り返します。 for()の型はコンパイラのヒントにすぎません。

詳細については、this questionを参照してください。

どのようにビューからテキストフィールドに変換しますか?

これはタイプキャスティングのためのものです。

for (UIView *view in [self.view subviews]) { 
    if ([view isKindOfClass:[UITextField class]]) { 
     // you don't need to cast just to add to the array   
     [mutableTFs addObject:view]; 
     // typecasting works as it does in C 
     UITextField *textField = (UITextField *)view; 
     // do something with textField 
    } 
} 
+0

ありがとう型キャスティング、これまで聞いたことがない! –

+0

@Alex Coplanあなたは歓迎です:)あなたは[ここ](http://stackoverflow.com/search?q=%5Bobjective-c%5D+cast+object)の検索を開始することができます。 – albertamg

0

ここが最善の方法です。あなたはUITextField *にIDから(高速列挙で)既にキャストされている値と仕事ができるだろう、との高速な列挙を実行しているタイプとしてUITextField *を指定することにより

// Make sure you're releasing this! 
NSMutableArray *textFields = [[NSMutableArray alloc] init]; 

for (UITextField *textField in [self.view subviews]) { 
    if ([textField isKindOfClass:[UITextField class]]) { 
     [textFields addObject:textField]; 
    } 
} 

これは、彼らが実際にもののUITextFieldsされているので、あなたはまだあなたが現在作業しているオブジェクトが本当にUITextFieldであることを確認するために、この場合isKindOfClass:には、実行時にチェックが必要であることを保証するものではありません。

したがって、両方とも正しいですが、組み合わせた場合のみです。

0

最初の方法は、2つの方法の唯一の方法です。

2番目の方法は、すべてのサブビューを配列に追加します。つまり、subViewssubviewsに変更するとします。

次の操作を行うことができます:

for (UITextField *textField in [self.view subviews]) { 
    if ([textField isKindOfClass:[UITextField class]]) {    
     [mutableTFs addObject:textField]; 
    } 
} 

あなただけではなく、アレイに追加の具体的な何かテキストフィールドを行うには、テキストフィールドにビューを変換する必要はないでしょうその方法。

編集:テキストフィールドとテキストビューの両方を探しているため、すぐにテキストフィールドに変換したくない場合は、これは、後でそれを変換したい方法です:

テキスト フィールドを見つけるために、サブビューを列挙の正しい方法である
for (UIView *view in [self.view subviews]) { 
    if ([view isKindOfClass:[UITextField class]]) {    
     UITextField *textField = (UITextField *)view; 
     // Do whatever you want with the text field. 
    } 
    if ([view isKindOfClass:[UITextView class]]) {    
     UITextView *textView = (UITextView *)view; 
     // Do whatever you want with the text view. 
    } 
} 
関連する問題