2012-01-13 16 views
6

の配列は、どのように私はビューコントローラ内のすべてのUITextFieldsの配列を取得することができます取得しますか?すべてUITextFields

編集:私は配列にテキストフィールドをハードコーディングする必要はありません。私は実際にその代理人の呼び出し元からすべてのフィールドの代理人の中のリストを取得したい。

+0

作成時に配列に追加する??? –

+0

デリゲートにはテキストフィールドへの参照が含まれていないことに注意してください。これは逆もあり、デリゲートからのフィールドだけを見つける方法はありません。 http://developer.apple.com/library/ios/#documentation/uikit/reference/UITextFieldDelegate_Protocol/UITextFieldDelegate/UITextFieldDelegate.html – Tim

答えて

16

再帰実装:(これはあなたがuiscrollviewに埋め込まれたテキストフィールドを捕まえる方法など)

-(NSArray*)findAllTextFieldsInView:(UIView*)view{ 
    NSMutableArray* textfieldarray = [[[NSMutableArray alloc] init] autorelease]; 
    for(id x in [view subviews]){ 
     if([x isKindOfClass:[UITextField class]]) 
      [textfieldarray addObject:x]; 

     if([x respondsToSelector:@selector(subviews)]){ 
      // if it has subviews, loop through those, too 
      [textfieldarray addObjectsFromArray:[self findAllTextFieldsInView:x]]; 
     } 
    } 
    return textfieldarray; 
} 

-(void)myMethod{ 
    NSArray* allTextFields = [self findAllTextFieldsInView:[self view]]; 
    // ... 
} 
+0

ではないこの 'IF([X respondsToSelector:@selector(サブビュー)]){' -subviews'戻り '@property(非アトミック、読み取り専用コピー)にNSArray * subviews'冗長。したがって、その配列内の任意の項目は '@selector(サブビュー)' –

+0

応答するタイプ 'UIView'またはそのサブクラスか' UIView'、のものであろう私はちょうど私がしてもいないオブジェクトにメッセージを投げるについて非常に不安定です'subviews'が非' UIView'継承オブジェクトを含み、 '@selector(subviews)'に応答しないオブジェクトを含むような、いくつかの骨頭が 'UIView'をサブクラス化した場合どうなりますか? – Tim

+0

メソッドをオーバーライドし、UIView以外のものを追加するのは実際には意味がありません。ユーザーがそうしているとすれば、彼らがなぜそれをやっているのか、何らかのリスクが関与しているかを知るのに十分なほどです。少なくともそれは誰かが望むものです) –

-1

あなたはできる、コントローラのビューのサブビューをループ。

ここラフ例です:すべてのサブビューサブビューを検索する

NSMutableArray *arrOfTextFields = [NSMutableArray array]; 
for (id subView in self.view.subviews) 
{ 
    if ([subView isKindOfClass:[UITextField class]]) 
     [arrOfTextFields addObject:subView]; 
} 
+0

これは、他のビューに埋め込まれUITextFieldsをキャッチしません。 –

-1

EDIT(ジャストティムのための)グローバル変数なし再帰

-(NSArray*)performUIElementSearchForClass:(Class)targetClass onView:(UIView*)root{ 

    NSMutableArray *searchCollection = [[[NSMutableArray alloc] init] autorelease]; 

    for(UIView *subview in root.subviews){ 

     if ([subView isKindOfClass:targetClass]) 
      [searchCollection addObject:subview]; 

     if(subview.subviews.count > 0) 
      [searchCollection addObjectsFromArray:[self performUIElementSearchForClass:targetClass onView:subview]]; 

    } 

    return searchCollection; 
} 
+0

ns * muttable * array – Tim

+0

ありがとうTim、SO :-)の自動修正なし – Cyprian

+0

私は自分自身でこういうことをしばしば入力しています: 'NSMutableArray] alloc] init] autorelease' XCodeは私を駄目にします:P – Tim

3

NSArrayがすべてUITextFieldを含む必要があることがわかっている場合は、それを配列に追加してみませんか?

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

UITextField *textField = [[UITextField alloc] initWithFrame:myFrame]; 

[textFields addObject:textField]; // <- repeat for each UITextField 

あなたはペン先を使用している場合は、その後のテキスト値を含む配列を取得するには、次のコード-useその配列

+0

それらを配列にハードコーディングするのは無意味です...すべてのテキストフィールドの配列を取得したいという私の目的を守りません。私はそれを手動で作成することができます... – Bot

+0

'UITextField'を' NSMutableArray'に追加して作成するときにはハードコーディングがありません。 –

+0

APIからのデータに基づいてテキストフィールドを作成しますどのテキストフィールドがあるのか​​わかりません。私はそれらを作成するときにプログラムで追加することができますが、各フィールドを配列に追加するために開発者に依存するのではなく、すでに存在するフィールドのリストを取得する方が好きです。 – Bot

1

にすべてUITextField年代を接続するとIBOutletCollection

@property (nonatomic, retain) IBOutletCollection(UITextField) NSArray *textFields; 

を使用表示されるすべてのUITextField表示:

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

    for(id aSubView in [self.view subviews]) 
    { 
      if([aSubView isKindOfClass:[UITextField class]]) 
      { 
        UITextField *textField=(UITextField*)aSubView; 
        [addressArray addObject:textField.text]; 
      } 
    } 
    NSLog(@"%@", addressArray); 
関連する問題