Получить массив всех UITextFields - PullRequest
7 голосов
/ 14 января 2012

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

РЕДАКТИРОВАТЬ: я не хочу жестко закодировать текстовые поля в массив. Я действительно хочу получить список внутри делегата всех полей от вызывающего этого делегата.

Ответы [ 6 ]

17 голосов
/ 14 января 2012

Рекурсивная реализация для поиска всех подпредставлений подпредставлений: (таким образом вы ловите текстовые поля, встроенные в 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]];
   // ...
 }
3 голосов
/ 14 января 2012

Если вы знаете, что вам нужен 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 к этому массиву

1 голос
/ 29 июня 2018
extension UIView 
{
   class func getAllSubviewsOfType<T: UIView>(view: UIView) -> [T] 
   {
       return view.subviews.flatMap { subView -> [T] in
       var result = UIView.getAllSubviewsOfType(view: subView) as [T]
       if let view = subView as? T {
           result.append(view)
       }
       return result
     }
   }

   func getAllSubviewsWithType<T: UIView>() -> [T] {
       return UIView.getAllSubviewsOfType(view: self.view) as [T]
   }
}

Как использовать с текстовыми полями:

let textFields = self.view.getAllSubviewsWithType() as [UITextField]
1 голос
/ 21 февраля 2013

-Используйте следующий код, чтобы получить массив, который содержит текстовые значения всех 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);
0 голосов
/ 14 января 2012

РЕДАКТИРОВАТЬ Рекурсия без глобальной переменной (только для Тима)

-(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 голосов
/ 14 января 2012

Вы можете просмотреть циклы подпредставлений представления контроллера.

Вот пример грубый пример:

NSMutableArray *arrOfTextFields = [NSMutableArray array];
for (id subView in self.view.subviews)
{
    if ([subView isKindOfClass:[UITextField class]])
       [arrOfTextFields addObject:subView]; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...