Как перечислить через UITextFields на iOS - PullRequest
3 голосов
/ 21 июля 2011

Какой правильный способ перечисления через подвиги для поиска текстовых полей?

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];
}

Я знаю, что это неправильная формулировка, но что я не понимаю, так это если это верхний метод, как вы «конвертируете» его из представления в текстовое поле?

Ответы [ 3 ]

10 голосов
/ 21 июля 2011

Какой правильный способ перечисления через подвиги для поиска текстовых полей?

Первый метод является правильным.Второй метод будет перебирать все подпредставления, а не только подпредставления с типом UITextField.Тип в for() является лишь подсказкой для компилятора.

Для получения дополнительной информации см. этот вопрос .

как вы «конвертируете»это из представления в текстовое поле?

Это то, для чего нужно приведение типов.

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 голосов
/ 21 июля 2011

Первый метод является единственным рабочим методом из двух.

Второй метод добавил бы все подпредставления в массив. То есть если вы измените subViews на subviews.

Вы можете сделать следующее:

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.
    }
}
0 голосов
/ 21 июля 2011

Вот лучший способ.

// 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];
    }
}

Указав UITextField * в качестве типа, с которым вы выполняете быстрое перечисление, вы будете работать со значениями, уже приведенными (быстрым перечислением) от id к UITextField *. Это не гарантирует, что они на самом деле являются UITextFields, хотя , поэтому вам все еще нужна проверка во время выполнения, в данном случае isKindOfClass:, чтобы убедиться, что объект, над которым вы работаете в данный момент, действительно UITextField.

Итак, оба они верны, но только в сочетании.

...