2012-01-04 1 views
1

Предположим, что у меня есть 4 UITextFields (line1, line2, line3 и line4) как ivars в классе My viewcontroller. Я хочу быстро перечислить массив, состоящий из 4 строк, а затем заполнить каждый из UITextFields строковыми данными из массива. Как получить ссылку на каждый из UITextFields? Я знаю, что с KVC (см. Код) возможен один способ, но есть ли другой вариант для этого?Objective-C Быстрый экземпляр экземпляра перечисления с доступом

int i = 1; 
for(NSString *string in array) { 
    NSString *fieldName = [NSString stringWithFormat:@"line%@", i]; 
    UITextField *field = [self valueForKey:fieldName]; 
    field.text = string; 
} 
+1

* cough * вы, вероятно, хотите увеличить этот 'i', и это не'% @ '. Я буду публиковать более полезные комментарии в качестве фактического ответа ... – Tommy

ответ

1

Вы можете поместить UITextfield «S в массив и сделать

UITextField *textField = nil; 

[stringArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){ 
    textField = [textFieldArray objectAtIndex:idx]; 
    textField.text = obj;   
}]; 
1

Ключ к добавить текстовые поля в массив. Теперь, когда у вас есть ссылки на все из них, вы можете установить все их значения все, что вы хотите:

//Thanks @Tommy for the array suggestion 
NSArray *arrayOfFields = [NSArray arrayWithObjects:textField1, textField2, textField3, textField4, nil]; 
for(NSString *string in array) 
    [fields setValue:string forKey:@"text"]; //<---Thanks @Paul.s 

[fields release]; 
+0

Или даже просто '[NSArray arrayWithObjects: textField1, textField2, textField3, textField4, nil];' для компактности. – Tommy

+0

Это установило бы их все одинаковое значение. OP имеет массив строк. Но еще проще с вашим примером вы могли бы сделать: '[fields setValue: @" foo "forKey: @" text "];'. Метод 'makeObjectsPerformSelector: withObject:' всегда выглядит для меня немного неприятным. –

2

Вы можете установить атрибут тега на каждом UITextField, а затем использовать - (UIView *) viewWithTag: (NSInteger).

+0

Предполагая, что это работает визуально, умным движением может быть сбор всех текстовых полей в общее родительское представление, у которого нет других подзонов. Это эффективно дало бы им уникальное пространство имен для своих тегов. – Tommy

+0

Я сделал вещи, где я только что установил теги к чему-то уникальному, как 1001, 1002, ... Затем обработайте модификацию, вычтите 1000 в коде. –

0

Предполагая, что вы готовы иметь IOS 4 будет пол вашей поддержки, теперь вы можете создавать коллекции непосредственно в конструкторе интерфейса. Таким образом, вы бы объявить что-то вроде:

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

Вы можете затем провод, до, как многие UITextField с, как вам нравится, и NSArray будет создан и заполнен для вас нормальных механизмов загрузки СИБА.

+1

Это только для конструктора интерфейса? Я предпочитаю держать руки в стороне от IB: P –

+0

Интерфейс Builder или эквивалентная встроенная функциональность Xcode 4, да. Если вы создаете свои представления программным образом, кажется странным, что вы сохраняете свои ссылки в индивидуально именных переменных экземпляра. Почему бы просто не поместить их в массив? – Tommy