Что я должен использовать, -awakeFromNib или -viewDidLoad? - PullRequest
53 голосов
/ 18 декабря 2008

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

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

Ответы [ 5 ]

63 голосов
/ 18 декабря 2008

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

24 голосов
/ 25 октября 2010

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

12 голосов
/ 18 декабря 2008

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

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

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

7 голосов
/ 09 сентября 2012

Я постараюсь ответить, приведя пример:

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

Некоторые сбивающие с толку методы:

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

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

0 голосов
/ 22 января 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...