2012-01-13 3 views
6

Как я могу получить массив всех UITextFields в контроллере представления?Получить массив всех UITextFields

EDIT: Я не хочу, чтобы жесткие коды текстовых полей были в массиве. Я действительно хочу получить список внутри делегата из всех полей от вызывающего лица этого делегата.

+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 responsesToSelector: @selector (subviews)]) {' redundant as '-subviews' возвращает' @property (неатомный, только для чтения, копия) NSArray * subviews'. Поэтому любой элемент в этом массиве будет иметь тип 'UIView' или подкласс или' UIView', который отвечает на '@selector (subviews)' –

+0

. Я просто очень шаткий в том, что вы бросаете сообщения на объекты, для которых я даже не узнайте класс - что, если какой-нибудь ошейник подклассифицировал 'UIView' таким образом, что' subviews' содержит объекты, не содержащие 'UIView', и, следовательно, объекты, которые не отвечают на' @selector (subviews) '? – 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

Спасибо Тим, нет автокоррекции в SO ;-) – Cyprian

+0

Я часто набираю текст на SO: '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 

Если вы используете перо затем использовать IBOutletCollection

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

Затем соедините все UITextField «S в этом массиве

+0

жесткое кодирование их в массив бессмысленно ... Поражает цель, когда я хочу получить массив всех текстовых полей как Я могу просто создать его вручную ... – Bot

+0

Нет жесткого кодирования, если вы добавляете 'UITextField' в' NSMutableArray', а когда вы их создаете –

+0

Я буду создавать текстовые поля, основанные на данных, поступающих из API, поэтому я выиграл Не знаю, какие текстовые поля есть. Я мог бы просто добавить их программно, когда я их создам, но я бы предпочел просто получить список полей, которые уже существуют, а не в зависимости от разработчика, чтобы добавить каждое поле в массив. – Bot

1

-Использование следующий код, чтобы получить массив, который содержит текстовые значения все UITextField представлены на View:

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); 
Смежные вопросы