2012-06-28 3 views
0

Я пытаюсь записать диск с данными Приложение, в котором я разбираю строку json для создания пользовательского интерфейса. Я реализовал это и создал необходимые элементы управления. Я различаю каждый элемент управления на основе назначенного им тега, который неэффективен. Нужно ли все-таки присвоить UIControl имя (кроме метки и текстового поля в следующем примере) при динамическом создании?iOS: создавать и назначать имена для UIControl динамически

NSMutableArray *myArray = [[NSMutableArray alloc] initWithCapacity: myArrayCount]; 
for (loop = 0; loop< myArrayCount; loop++) { 
    NSString *propertyName = [NSString stringWithFormat:@"Label %d", loop]; 
    [myArray addObject:propertyName]; 

    CGRect labelFrame = CGRectMake(xLabel, yLabel, widthLabel, heightLabel); 
    UILabel *label = [[UILabel alloc] initWithFrame: labelFrame]; 
    label.tag = loop; 
    [label setText:propertyName]; 
    [label sizeToFit]; 
    [self.view addSubview:label]; 

    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(xTextField, yTextField, widthTextField, heightTextField)]; 
    textField.tag = loop; 
    textField.borderStyle = UITextBorderStyleRoundedRect; 
    textField.font = [UIFont systemFontOfSize:15]; 
    textField.placeholder = @"Enter parameter value"; 
    textField.autocorrectionType = UITextAutocorrectionTypeNo; 
    textField.keyboardType = UIKeyboardTypeDefault; 
    textField.returnKeyType = UIReturnKeyDone; 
    textField.clearButtonMode = UITextFieldViewModeWhileEditing; 
    textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 
    textField.returnKeyType = UIReturnKeyDone; 
    textField.delegate = self; 
    [self.view addSubview:textField]; 

    yLabel = yLabel+yOffset; 
    yTextField = yTextField+yOffset; 

} 
+0

Tag является эффективным способом определить динамический UIControls, если вы идете по именам, это усложнит ситуацию. – rishi

+0

Я так думаю, но просто интересно, есть ли у кого-нибудь другое решение. Каждый раз, когда я хочу получить доступ к определенному текстовому полю, мне нужно разобрать все текстовые поля и получить тот, у кого есть правильный тег, и получить его значение! Кроме того, у меня есть много других элементов управления, таких как кнопки, сегментированные элементы управления, uipicker и т. Д.. Могу ли я использовать тег для всех из них? – applefreak

ответ

0

Предполагая, что вы не хотите использовать [self.view viewWithTag:tag] для извлечения элементов управления, один из способов сделать ссылку на динамически созданный контроль по имени было бы поместить его в NSMutableDictionary с динамически ключ.

Так что, возможно, что-то вроде (модификация кода с некоторыми деталями опущены):

NSMutableDictionary *controlsDictionary = [[NSMutableDictionary alloc] init]; 
for (loop = 0; loop< myArrayCount; loop++) { 

CGRect labelFrame = CGRectMake(xLabel, yLabel, widthLabel, heightLabel); 
UILabel *label = [[UILabel alloc] initWithFrame: labelFrame]; 
[controlsDictionary setObject:label forKey:[NSString stringWithFormat:@"label%d", loop]]; 

UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(xTextField, yTextField, widthTextField, heightTextField)]; 
[controlsDictionary setObject:label forKey:[NSString stringWithFormat:@"textField%d", loop]]; 

yLabel = yLabel+yOffset; 
yTextField = yTextField+yOffset; 

} 

Затем вы можете получить элементы управления с помощью утверждений, как [controlsDictionary objectForKey:@"label1"]

+0

Это на самом деле то, что я делаю. Ключ на самом деле является значением тега! – applefreak

+1

Прохладный. См. Также метод 'viewWithTag' в' UIView', который должен позволить вам напрямую находить помеченный подзаголовок без сохранения вашего собственного словаря. –

+0

Ничего себе! viewWithTag выглядит здорово, я думаю! Спасибо за это. – applefreak

0

В то время как вы не можете добавить Ивар к UIControl через категорию, вы можете добавить связанные объекты, которые могут быть использованы для выполнения много той же функции.

Таким образом, создать категорию на UIControl, как это:

static char kControlNameKey; 

- (void) setControlName: (NSString *) name 
{ 
    objc_setAssociatedObject(self, &kControlNameKey, name, OBJC_ASSOCIATION_COPY); 
} 

- (NSString *) controlName 
{ 
    return (NSString *)objc_getAssociatedObject(array, &kControlNameKey); 
} 

Там больше, чем это, я думаю, вам нужно проверить, если связь существует перед установкой нового, в противном случае она будет течь , но это должно дать вам начало.

Смотрите Apple Docs для более подробной информации

+0

Просто быстрый вопрос. Означает ли это, что значение, введенное в текстовое поле, будет удерживаться связанным объектом? – applefreak

+0

Нет, связанный объект похож на iVar, который вы можете добавить в экземпляр - в этом случае это похоже на добавление свойства NSString propertyName ко всем UIControls. –

Смежные вопросы