Почему self.view вызывает метод установки подвида?

У меня есть собственный контроллер представления с несколькими подпредставлениями. Каждое из этих подпредставлений связано с файлом .m контроллера представления через свойства IBOutlet. Эти подпредставления имеют настраиваемые установщики, которые регулируют размер других подпредставлений в зависимости от того, отображает ли это подпредставление контент.

Теперь кажется, что эти пользовательские установщики вызываются initWithCoder: до вызова viewDidLoad. (Я надеюсь/предполагаю, что это нормально.)

Моя проблема в том, что вызов self.view обращается к методам установки для подвидов self.view. Мое текущее понимание состоит в том, что это не должно быть необходимо. Может кто-нибудь объяснить, что здесь происходит? Я бы предпочел, чтобы этого не происходило, поскольку я не собираюсь ничего устанавливать, обращаясь к self.view.

Вот код: https://github.com/kenmhaggerty/Sandbox


person Ken M. Haggerty    schedule 12.01.2013    source источник
comment
какие пользовательские сеттеры? Вы переопределили установщик/получатель свойств UIView, такой как ash setFrame:?   -  person Bryan Chen    schedule 12.01.2013
comment
Я создал три свойства формы @property (nonatomic, strong) IBOutlet UIView *viewOne в своем контроллере представления, и каждое представление имеет соответствующий настраиваемый установщик формы - (void)setViewOne, в котором я настраиваю размер других представлений в зависимости от того, установил ли я viewOne что-то из nil или nil из чего-то.   -  person Ken M. Haggerty    schedule 12.01.2013
comment
Возможно, вы могли бы предоставить образец кода, который вы не хотите вызывать при доступе к свойству view (вау, это странно)   -  person CodaFi    schedule 12.01.2013
comment
Хорошо, я добавил загрузку на GitHub в исходный пост. (Я до сих пор понятия не имею, как использовать GitHub... :S)   -  person Ken M. Haggerty    schedule 12.01.2013
comment
Кажется, половина ваших занятий и некоторые связанные с ними ресурсы не пришли, когда вы совершили коммит. Попробуйте поместить файлы .git в каталог верхнего уровня проекта XC и убедитесь, что ресурсы и файлы копируются в каталог проекта, а не просто добавляются как ссылки на что-то только на вашем жестком диске.   -  person CodaFi    schedule 12.01.2013


Ответы (1)


Вызов self.view на контроллере представления заставляет его загружать свое представление из пера, если это еще не сделано. Это создает экземпляры всех объектов в nib (используя initWithCoder:) и устанавливает значения любых выходов (используя ваши методы доступа). Затем он вызывает viewDidLoad, и к этому моменту все в nib будет существовать.

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

person jrturton    schedule 12.01.2013