IB объекты и объекты, выделенные вручную в init / viewDidLoad - PullRequest
1 голос
/ 19 мая 2009

Когда я программно выделил UILabel в своем пользовательском методе initWithNibName, а позже в viewDidLoad попытался присвоить ему строку, метка не указывала ни на что. Я не выпустил это; метка отображается на экране. Если я создаю метку в IB и назначаю ей текст в viewDidLoad, она работает.

Противопоказано ли правило устанавливать вручную выделенные объекты в viewDidLoad? Почему он ни на что не указывает, хотя viewDidLoad вызывается после моего init?

Из документа viewDidLoad:

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

В моем init:

_descriptionLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 218, 280, 10)];
    _descriptionLabel.numberOfLines = 0;
    _descriptionLabel.lineBreakMode = UILineBreakModeWordWrap;
    _descriptionLabel.font = [UIFont systemFontOfSize:12.0];
    _descriptionLabel.adjustsFontSizeToFitWidth = NO;
    _descriptionLabel.text = @"Description not found.";
    _descriptionLabel.backgroundColor = [UIColor clearColor];

В viewDidLoad значение переменной равно 0x0. То же самое с моим вручную выделенным UIButton, который полностью работает после загрузки представления.

Ответы [ 2 ]

1 голос
/ 19 мая 2009

Если вы хотите создать UILabel программно, вы можете, но вы все равно делаете это в viewDidLoad (в отличие от initWithNibName).

Не бойтесь выполнить настройку пользовательского интерфейса в viewDidLoad. Предусмотрено добавление любых статических элементов пользовательского интерфейса ДО появления на экране вида.

Представление не появится до тех пор, пока viewDidAppear: (BOOL) не будет анимирован.

Если у вас динамический контент, настройте его в viewWillAppear: (BOOL) animated. (Это похоже на вашу ситуацию)

Затем убедитесь, что вы добавили его в представление:

[self.view addSubview:myLabel];

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

0 голосов
/ 19 мая 2009

В опубликованном коде _descriptionLabel UILabel не сохраняется и будет освобожден до отрисовки представления.

Попробуйте

_descriptionLabel = [[[UILabel alloc] initWithFrame:CGRectMake(20, 218, 280, 10)] retain];

Убедитесь, что вы поместили [_descriptionLabel release] в dealloc. Это предполагает, что _descriptionLabel является переменной экземпляра.

Это в основном относится к любому объекту, который вы создаете с помощью alloc, copy или new.

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