Ответ 1
awakeFromNib
вызывается, когда сам контроллер не имеет аналогов из ниба. viewDidLoad
вызывается, когда view создается/распаковывается. Это различие особенно важно, когда представление контроллера хранится в отдельном файле nib.
У меня недавно возникла проблема в моем приложении, где некоторые из подзонов, которые я создавал в подклассе UIViewController -awakeFromNib
, исчезали из представления. После некоторого толчка я обнаружил, что перемещение кода, который я поставил в -awakeFromNib
в -viewDidLoad
, решил проблему. Кажется, что -awakeFromNib
вызывается только один раз, когда UIViewController является unarchived из nib, а -viewDidLoad
вызывается каждый раз, когда представление распаковано.
Так какая лучшая практика? Похоже, что UIViewController -awakeFromNib
не должен добавлять какие-либо представления в представление, такие вещи следует делать в -viewDidLoad
. Я правильно понимаю это? Или я больше смущен, чем думал?
awakeFromNib
вызывается, когда сам контроллер не имеет аналогов из ниба. viewDidLoad
вызывается, когда view создается/распаковывается. Это различие особенно важно, когда представление контроллера хранится в отдельном файле nib.
Также важно, чтобы функция awakeFromNib
никогда не вызывалась после восстановления из памяти. Но будет вызываться функция viewDidLoad
.
Да, это правильно. Вы не должны полагаться на awakeFromNib
для выполнения таких задач.
awakeFromNib
похож на событие, вызванное после десериализации в .NET. viewDidLoad
похож на событие Load
в .NET.
Если вы знакомы с концепциями .NET, этого должно быть достаточно, я думаю.
Я попытаюсь ответить, указав пример:
Если определить customCell
class и customCell.xib
файл, а затем загрузить ячейку, используя
- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options
, awakeFromNib вызывается, когда объекты в xib являются unarchived.
Если вы определяете customViewController
, тогда, когда customViewController
создается с помощью - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
. viewDidLoad вызывается при загрузке в иерархию представлений.
Некоторые связанные с запутанностью методы:
(пустоты) loadView; Здесь подклассы должны создавать свою собственную иерархию представлений, если они не используют ниб. Если вы не укажете имя ниба, loadload попытается загрузить нить, имя которого совпадает с именем вашего класса контроллера. Если такой ник не существует, вы должны либо вызвать -setView: перед вызовом -view, либо переопределить метод -loadView для автоматической настройки ваших представлений. -loadView никогда не следует вызывать напрямую.
(void) viewDidLoad: вызывается после загрузки представления. Для viewControllers, созданных в коде, это после -loadView. Для контроллеров представлений, не имеющих аналогов из ниба, это происходит после того, как представление установлено.
Для ViewController IBOutlets доступны в viewDidLoad()
Здесь stackView представляет IBOutlet в ViewController, stackView равен нулю в awakeFromNib, но он был создан при вызове viewDidLoad().