Почему awakeFromNib вызывается дважды при загрузке nib в nib?

У меня есть два пера: Parent.xib и Child.xib.

Я включил дочерний наконечник внутри родительского, чтобы упростить привязку. Я установил subview программно в loadView. Проблема в том, что awakeFromNib дважды вызывается в контроллере Child.

Кажется, я понимаю, почему это происходит. Когда Parent завершает загрузку, он отправляет awakeFromNib своим объектам, а поскольку Child является владельцем файла своего пера, он также вызывает awakeFromNib для себя.

Я правильно понимаю? Первоначально у меня сложилось впечатление, что awakeFromNib следует вызывать только один раз для каждого экземпляра. Разве я не должен вставлять перо в перо?

См. пример проекта: https://github.com/panupan/AwakeFromNibTest.


person panupan    schedule 20.07.2012    source источник


Ответы (2)


Бывают ситуации, когда awakeFromNib можно вызывать более одного раза для каждого экземпляра, например тот, который вы настроили. Другим случаем является контроллер, который загружает более одного объекта пера. Вы можете обойти это, если действительно хотите, но лучший дизайн не обязателен. Из справочника по протоколу NSNibAwaking< /а>:

Рекомендуется, чтобы вы поддерживали однозначное соответствие между вашими объектами «Владелец файла» и связанными с ними файлами пера. Загрузка двух файлов nib с одним и тем же объектом File's Owner приводит к тому, что метод awakeFromNib этого объекта вызывается дважды, что может привести к нежелательной повторной инициализации некоторых структур данных. Также рекомендуется избегать загрузки других файлов пера из реализации метода awakeFromNib.

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

person torrey.lyons    schedule 20.07.2012
comment
Допустим, я хочу использовать NSObjectController в обоих перьях. Будет ли лучший способ связать их с помощью кода? Причина, по которой я встроил один наконечник в другой, заключается в том, что привязки можно было выполнять без написания кода. Спасибо. - person panupan; 21.07.2012
comment
Вы делаете IBOutlet экземпляру NSObjectController. Затем в awakeFromNib вы используете -setContent: для привязки контроллера объекта к объекту, который вы хотите, чтобы он представлял в другом файле пера. В Interface Builder вы можете установить класс объекта, который представляет контроллер, и любые имеющиеся у него ключи, которые вы будете использовать. Затем вы можете использовать привязки к контроллеру объекта в вашем файле пера, как если бы это был исходный объект. В IB установите ключ контроллера на выбор, а путь ключа модели — на любой ключ исходного объекта. - person torrey.lyons; 21.07.2012

Даже если у меня два разных владельца файлов, awakeFromNib все равно вызывается дважды.

Если у меня есть подкласс NSWindowController (MyWindowController) и в его nib у меня есть объект ProjectController, который содержит awakeFromNib, который загружает представление из nib, контроллер представления получит вызов awakeFromNib, а затем исходный ProjectController снова получит awakeFromNib.

person Trygve    schedule 13.03.2021