Создавать элементы программно и повторно использовать код - PullRequest
0 голосов
/ 27 февраля 2011

Мне нужно создать несколько кнопок и меток программно.По большей части они будут иметь одинаковые атрибуты (opaque, backgroundColor, textColor) за исключением текста, тега и фрейма.

При попытке ограничить объем кода, который мне нужно было набрать, яполагал, что это будет работать:

// generate generic properties for our buttons
UIButton *tempButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
tempButton.opaque = true;
tempButton.backgroundColor = [UIColor whiteColor];
tempButton.titleLabel.font = [UIFont fontWithName:@"Helvitica-Bold" size:15];;
[tempButton setTitleColor:[UIColor magentaColor] forState:UIControlStateNormal];
[tempButton addTarget:self action:@selector(handleButtonTap:) forControlEvents:UIControlEventTouchUpInside];

// generate specific button1 properties, assign to ivar, and display
tempButton.frame = CGRectMake(81, 136, 159, 37);
tempButton.tag = BUTTON_1_TAG;
[tempButton setTitle:@"button 1 title" forState:UIControlStateNormal];
self.button1 = tempButton;
[self.view addSubview:self.button1];

// generate specific button2 properties, assign to ivar, and display
tempButton.frame = CGRectMake(81, 254, 159, 37);
tempButton.tag = BUTTON_2_TAG;
[tempButton setTitle:@"button 2 title" forState:UIControlStateNormal];
self.button2 = tempButton;
[self.view addSubview:self.button2];

Как большинство из вас уже знают, отображается только последняя кнопка.Я предполагаю, что это потому, что все, что я на самом деле делаю, это перезаписываю tempButton.

Есть ли решение, которое позволяет мне выполнить то, что я пытаюсь сделать здесь, без необходимости создавать отдельные переменные "temp" для каждогоelement?

Кроме того, похоже, что с моим кодом выше будут проблемы утечки памяти.Насколько я понимаю, что tempButton изначально автоматически высвобождается, но каждый раз, когда я использую его для настройки своего ивара, его снова не сохраняют?После этого мне нужно будет отправить tempVar релиз, чтобы он вернулся к 1, чтобы при срабатывании авто-релиза он действительно был освобожден?

Спасибо за вашу помощь!

Ответы [ 4 ]

2 голосов
/ 27 февраля 2011

1.) Вы назначаете новый UIButton временной переменной. Это просто задание. Назначение не сохраняется, поэтому у вас нет утечки памяти.

2.) Вы можете создать метод, который возвращает частично сконфигурированную кнопку, а затем просто установить различные части:

- (UIButton *)myButton {
  UIButton *tempButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
  tempButton.opaque = true;
  tempButton.backgroundColor = [UIColor whiteColor];
  tempButton.titleLabel.font = [UIFont fontWithName:@"Helvitica-Bold" size:15];;
  [tempButton setTitleColor:[UIColor magentaColor] forState:UIControlStateNormal];
  return tempButton;
}


....
IButton *tempButton = [self myButton];
[tempButton setTitle:@"button 1 title" forState:UIControlStateNormal];
tempButton.frame = CGRectMake(81, 136, 159, 37);
[self.view addSubview:tempButton];
tempButton = [self myButton];
tempButton.frame = CGRectMake(81, 254, 159, 37);
[tempButton setTitle:@"button 2 title" forState:UIControlStateNormal];
[self.view addSubview:tempButton];

Поскольку вы дали своим кнопкам уникальные теги, вам не нужно присваивать iVArs, например, self.button1, self.button2, вы можете просто использовать [self.view viewForTag:] для получения правильного подпредставления. *

Но, как говорит другой парень, если вы используете 'self.button1 =', кнопка будет сохранена, и вам нужно будет освободить ее в dealloc и беспокоиться о вызовах - [view didUnload] - если вы не отпустите там, у вас будут указатели на кнопки, которых больше нет в представлении.

2 голосов
/ 27 февраля 2011

Вы можете создать метод, который создает ваш "tempButton".

- (UIButton *)createTempButton {
    UIButton *tempButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    tempButton.opaque = true;
    tempButton.backgroundColor = [UIColor whiteColor];
    tempButton.titleLabel.font = [UIFont fontWithName:@"Helvitica-Bold" size:15];;
    [tempButton setTitleColor:[UIColor magentaColor] forState:UIControlStateNormal];
    [tempButton addTarget:self action:@selector(handleButtonTap:) forControlEvents:UIControlEventTouchUpInside];
    return tempButton;
}

Тогда вы можете просто позвонить, когда вам понадобится новый "tempButton".

UIButton *aTempButton = [self createTempButton];
0 голосов
/ 27 февраля 2011

In:

self.button1 = tempButton;

Свойство button1 может быть свойством copy вместо свойства retain.Тогда любые дальнейшие изменения в tempButton не повлияют на копию объекта, хранящуюся в кнопке button1 ivar.Также не будет изменен счет сохранения для tempButton, поэтому вы можете сбросить его после завершения инициализации.

0 голосов
/ 27 февраля 2011
  1. Вы должны создать отдельные объекты кнопки.Поскольку UIButton не соответствует протоколу NSCopying, более простого способа сделать это не существует.Если вы делаете много, напишите метод, который создает кнопку, устанавливает общие свойства и возвращает объект.Другой способ - создать файл Nib и создавать экземпляры.

  2. Сохраняет ли self.button = ... вашу кнопку?Да, если установщик свойства сохраняет его.Вам придется освободить его, когда идентификатор представления выгружен или освобожден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...