Что я должен использовать, - awakeFromNib или-viewDidLoad?


недавно у меня была проблема в моем приложении, где некоторые из подвидов, которые я создавал в подклассе UIViewController -awakeFromNib метод исчезали из поля зрения. После некоторого копания я обнаружил, что перемещение кода, который я вставил -awakeFromNib до -viewDidLoad решена проблема. Кажется, что -awakeFromNib вызывается только один раз, когда для UIViewController является разархивирована от кончика, а -viewDidLoad вызывается каждый раз, когда представление разархивирована.

так что это лучшая практика? Похоже UIViewController -awakeFromNib Не следует добавлять какие-либо представления в представление, такие вещи должны быть сделаны в -viewDidLoad. Я правильно понимаю? Или я запутался больше, чем думал?

4 52

4 ответа:

awakeFromNib вызывается, когда контроллер это разархивирована от ниб. viewDidLoad вызывается, когда посмотреть создан/разархивирована. Это различие особенно важно, когда вид контроллера хранится в отдельном файле nib.

также важно, что awakeFromNib функция никогда не будет вызвана после восстановления из памяти предупреждения. Но viewDidLoad функция будет вызываться.

Да, это правильно. Вы не должны действительно полагаться на awakeFromNib для выполнения такого рода задач.

awakeFromNib похоже на событие, которое вызывается после десериализации в. NET.viewDidLoad похож на Load событие .Чистая.

если вы знакомы с понятиями из .NET, этого должно быть достаточно, я думаю.

я постараюсь ответить на примере:

если определить customCell класс а customCell.xib файл, а затем загрузить ячейку с помощью
- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options,awakeFromNib вызывается, когда объекты в xib являются разархивирована.

если вы определили customViewController, когда customViewController создается с помощью - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil. viewDidLoad будет вызван, когда он загружен в иерархию представления.

некоторые связанные путаешь методы:

  • (void)loadView; это где подклассы должны создать свою собственную иерархию представления, если они не используют перо. Если вы не укажете имя пера, loadView попытается загрузить перо, имя которого совпадает с классом контроллера представления. Если такой nib не существует, то вы должны либо вызвать-setView: before-view вызывается, либо переопределить-loadView метод для настройки представлений программно. - loadView никогда не должен называться непосредственно.

  • (void)viewDidLoad: вызывается после загрузки представления. Для viewControllers, созданных в коде, это after-loadView. Для контроллеров представлений, неархивированных из пера, это происходит после установки представления.