Если вы создаете свои представления в IB, тогда вы должны использовать viewDidLoad
. Это будет вызываться каждый раз при инициализации представления. Вы используете initWithNibName
: когда вы создаете свое представление в коде. Вы не должны использовать awakeFromNib
с представлениями для iPhone.
Причина, по которой initWithNibName
, по-видимому, не вызывается, заключается в том, что построитель интерфейса фактически создает реальный экземпляр вашего контроллера представления, а затем сериализует это представление. Таким образом, когда вы создаете контроллер представления в IB (в основном добавляете его в свой проект), IB вызывает initWithNibName
, но если вы не переопределили значение по умолчанию encodeWithCoder
:, все переменные, которые вы установили там, будут ушел, когда представление загружено из пера (десериализовано). Как правило, это нормально, так как вы обычно хотите настроить свое представление на информацию, относящуюся к текущему, запущенному контексту ваших приложений, а не к предопределенным инициализаторам.
Даже если вы программно создаете представления и контроллеры представлений, вы все равно можете поместить всю инициализацию в viewDidLoad
. Это часто лучше, потому что если ваше представление заканчивается кэшированием (выгружается) и затем возвращается на экран, viewDidLoad
может быть вызван снова, тогда как ваш инициализатор не обязательно будет. Например, вы создаете представление программным способом и помещаете его в стек контроллера навигации - позже представление было закрыто и выдается предупреждение памяти, поэтому контроллер nav «выгружает» ваше представление, но не освобождает объект - когда представление возвращается (другие представления отключаются), контроллер nav снова вызовет viewDidLoad
, так что вы можете повторно инициализировать, но initWithNib
больше не будет вызываться. Обратите внимание, что это редкий случай, и в любом случае приложения большинства людей в этом случае будут ужасно умирать по другим причинам.