Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

Я попытаюсь ответить, указав пример:

Если определить 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. Для контроллеров представлений, не имеющих аналогов из ниба, это происходит после того, как представление установлено.

Ответ 5

Для ViewController IBOutlets доступны в viewDidLoad()

Здесь stackView представляет IBOutlet в ViewController, stackView равен нулю в awakeFromNib, но он был создан при вызове viewDidLoad().

IBOutlets state in awakeFromNib() vs IBOutlet state in viewDidLoad()