Какой метод вызывается первым при загрузке раскадровки? - PullRequest
7 голосов
/ 22 ноября 2011

Используя Xcode 4.2, в моем приложении загрузка представления запускается событием segue. Какой метод будет вызываться первым внутри контроллера представления?

-(void) viewWillAppear:(BOOL)animated работает, но это первый?

Инициализация происходит из Storyboard, кажется, метод init никогда не вызывается вручную при создании объекта.

Позвольте мне уточнить, что при создании экземпляра класса вручную мы обычно [[alloc]init] сначала его создаем. [init] в этом случае - первый метод, который должен быть выполнен, и хорошее место для различных инициализаций.

Что эквивалентно init методу, когда создание экземпляра класса происходит через событие segue? В таком случае, какой метод должен содержать всю логику инициализации?

Ответы [ 3 ]

14 голосов
/ 09 декабря 2011

Я думаю, что лучший вариант - -(void)awakeFromNib.Это происходит только один раз, тогда как viewWillAppear и viewDidLoad и т. Д. Могут вызываться более одного раза после вашей инициализации.

ОБНОВЛЕНИЕ: Как указано ниже Жан-Дени Мюйсом, -(id)initWithCoder:(NSCoder *)decoder - лучший вариантдля инициализатора, который вызывается только один раз, поскольку -(void)awakeFromNib потенциально может быть вызван более одного раза.

8 голосов
/ 27 марта 2012

Согласно Apple Руководство по программированию контроллера представления ,

Когда вы создаете контроллер представления в раскадровке, атрибуты, которые вы Настройка в Интерфейсном Разработчике сериализуется в архиве. Потом, когда создается экземпляр контроллера представления, этот архив загружается в память и обработано. Результатом является набор объектов, чьи атрибуты соответствуют тем, которые вы установили в Интерфейсном Разработчике. Архив загружен вызов метода initWithCoder: контроллера представления. Затем awakeFromNib метод вызывается для любого объекта, который реализует этот метод. Этот метод используется для выполнения любых шагов настройки, которые требует, чтобы другие объекты уже были созданы.

3 голосов
/ 08 апреля 2016

Я бы посоветовал не использовать awakeFromNib. Я просто использую обе эти функции

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        [self setup];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        [self setup];
    }
    return self;
}

- (void)setupButton {
    /* get ready to be called twice */
    self.layer.cornerRadious = 10.0f;
}

потому что: допустим, вы подкласс UIButton. Вы должны быть готовы к двум сценариям :

сценарий 1. Если вы добавите кнопку программно -> initWithFrame-> setupUI будет вызван Сценарий 2. Если вы добавите кнопку с помощью NIb -> initWithCoder-> setupUI, будет вызван.

...