pushViewController, когда устанавливать текст UILabel, и нужно ли вызывать setNeedsDisplay? - PullRequest
1 голос
/ 11 октября 2011

Сегодня я столкнулся с чем-то странным, что, возможно, кто-то что-то знает.У меня есть подкласс UIViewController и связанных с ним NIB.Я установил метки в методах UIViewController, и все это прекрасно работает.

Теперь из другого класса я снова создаю этот ViewController, потому что хочу использовать его повторно.Я делаю это:

MyViewController *vc = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
vc.titleLabel.text = @"testing";
vc.myTextLabel.text = @"yo";
self.navigationController pushViewController:vc animated:NO];
[vc release];

Это работает НЕ работает.Я понятия не имею, почему это не работает.Я бы подумал, что установлю все метки, а затем покажу контроллер представления, поместив его в стек.

Однако, если я сделаю это:1014 * работа.Это не имеет смысла для меня.Я думал, что setNeeds Display назывался ПОСЛЕ того, как представление должно быть перерисовано.Если я переместить setNeedsDisplay в конец блока, он не будет работать.Это работает только в начале блока, что очень странно для меня.Кто-нибудь сталкивался с этим раньше или знает, почему это так работает?Спасибо.

1 Ответ

7 голосов
/ 11 октября 2011

Причина в том, что представление контроллера представления загружается лениво. Это означает, что представление контроллера загружается только из кончика (или через -loadView) при первом обращении к свойству view. Если вы попытаетесь получить доступ к меткам до того, как представление будет загружено, они будут равны нулю, а любые отправленные вами сообщения будут запрещены.

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

/* make sure the view is loaded */
[vc view];
/* Access the label properties */
vc.titleLabel.text = @"testing";

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

В этом случае вы можете создать метки в методе контроллера init, чтобы они всегда существовали, и добавить их в представление контроллера представления вручную в -viewDidLoad, а не в своем кончике. Это позволит работать стандартному режиму отложенной загрузки, но пользователи вашего класса могут по-прежнему устанавливать свойства для меток до загрузки представления.

Альтернативой является предоставление простых NSString свойств со связанными ivars на контроллере представления для представления любых заголовков или текста в представлении. Затем в вашем -viewDidLoad вы можете установить текст меток равным значению этих свойств. Пользователи вашего контроллера представления могут затем установить эти свойства до загрузки представления.

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