2010-08-15 2 views
1

Мне просто интересно, почему, когда я создаю новый контроллер представлений, я должен нажать контроллер в стек, прежде чем назначать значения его свойствам? Почему, если я назначаю значение перед нажатием, это значения, не отправленные на контроллер навигации?Сфера свойств при программном создании контроллеров просмотров

это работает:

SomeViewController *newViewController = [[NewViewController alloc]initWith....]; 
[self.navigationController pushViewcontroller:newViewController animated:YES]; 
newViewController.property = value; 

это не:

SomeViewController *newViewController = [[NewViewController alloc]initWith....]; 
newViewController.property = value; 
[self.navigationController pushViewcontroller:newViewController animated:YES]; 

Точно так же, если мой новый контроллер представления имеет свойство UITextView, я не могу получить доступ к нему в качестве переменной экземпляра, пока Я поместил его в стек навигации. Я бы подумал, что переменная экземпляра будет доступна после создания экземпляра контроллера?

Спасибо за чтение!

+0

Это неправда, они оба должны работать. Что такое собственность? – jtbandes

+0

Ах, я должен был указать, что свойствами были IBOutlets. Спасибо за ответ. –

ответ

0

В общем, вы можете установить свойства перед тем, как нажать контроллер. Второй пример должен работать нормально (я часто использую эту последовательность в моем собственном коде).

Однако, если вы имеете дело со свойствами, которые являются IBOutlets, связанными с объектами в вашем файле nib, они обычно не будут подключены немедленно. Когда представление загружается из nib (чего не происходит, как правило, до тех пор, пока что-то не попытается получить доступ к свойству view вашего контроллера представлений), выходы подключаются к вновь созданным объектам пользовательского интерфейса.

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

Мой подход заключается в сохранении значений, необходимых для отображения представления в свойствах, отличных от IBOutlet, которые я установил до того, как я нажму на представление (или добавлю его в контроллер табуляции и т. Д.). Затем я настроил объекты UI в -viewDidLoad или -viewWillAppear.

+0

Спасибо, Seamus, Вы правы, свойства, которые я использую, это IBOutlets, поэтому я понимаю, почему они не могут использоваться до тех пор, пока контроллер представления не отобразит представление. спасибо. –

+0

Я не * думаю * есть гарантия, что нажатие контроллера представления загружает представление - если вы хотите принудительно загрузить представление, вызовите '[newViewController view]' явно. В общем, однако, избегайте файлов, для которых требуется, чтобы представление загружалось, так как оно может сломаться при предупреждении памяти. –

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