Почему мой назначенный инициализатор UIViewController никогда не вызывается? - PullRequest
3 голосов
/ 21 октября 2010

Я создал новый проект Xcode с шаблоном приложения на основе представления. В .m контроллера представления я переписал это:

// The designated initializer. Override to perform setup that is required before the view is loaded.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
        // Custom initialization

        NSLog(@"initWithNibName...");
    }
    return self;
}


- (id)init {
    NSLog(@"initWithNibName...");
    return [super init];
}

Однако я никогда не получаю этот NSLog. Это также мой опыт других проектов. Этот метод никогда не вызывается. Даже не -init от NSObject.

View Controller создается внутри файла XIB. Как это возможно, что система загрузки пера создает этот класс без какой-либо инициализации?

Почему? И что является альтернативой вместо -loadView и -viewDidLoad?

Еще одна веская причина держаться подальше от файлов XIB?

Ответы [ 3 ]

9 голосов
/ 21 октября 2010

Из iOS Руководство по программированию ресурсов

В iPhone OS любой объект, который соответствует протоколу NSCoding, инициализируется с использованием метода initWithCoder:. Это включает в себя все подклассы UIView и UIViewController, независимо от того, являются ли они частью библиотеки Interface Builder по умолчанию или заданными вами пользовательскими классами.

Думайте об этом так: назначенный инициализатор вызывается, когда ваш контроллер представления впервые создается в Интерфейсном Разработчике. Затем, когда вы сохраняете файл пера, экземпляр контроллера представления сохраняется в файле. Позже, когда перо загружается, экземпляр воссоздается из кончика.

Поскольку он воссоздается, а не создается впервые, используется другой метод инициализации. Этот метод (-initWithCoder:) восстанавливает состояние объекта, используя значения из файла пера, которые могут включать в себя настройки для свойств, помимо тех, которые были установлены назначенным инициализатором. Этот механизм основан на протоколе NSCoding, который позволяет ему работать в общем для многих различных классов.

1 голос
/ 21 октября 2010

Вы можете использовать - awakeFromNib для этого. Init вызывается только если вы делаете это в коде.

0 голосов
/ 21 октября 2010

Вы установили делегата своего MainWindow как ваш appDelegate ..?Реализуйте UIApplicationDelegate в вашем AppDelegate и в методе applicationDidFinishLaunching, попробуйте initWithNibName.Это сделает свое дело.

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