Я довольно новичок в программировании пользовательского интерфейса на Mac и iPhone, и я столкнулся с чем-то, что несколько озадачивает меня.Порядок инициализации и загрузки UIViewController
UIViewController имеет 3 методы, которые включают инициализацию него и его зрения:
- INIT (и INIT-подобных методов)
- loadView
- viewDidLoad (метод делегата)
Я ожидаю, что они произойдут в порядке, указанном выше. Первый UIViewController выделяется каким-то другим объектом, затем сразу же вызывается init (или какой-либо другой метод init, например initWithStyle).
Только один раз, когда объект инициализирован, я ожидаю, что он вызовет его собственную функцию loadView, после чего просмотр, однажды загруженный, вызывает метод делегирования viewDidLoad.
Этого не происходит, например:
@implementation UIViewControllerSubclass
- (id)init {
NSLog(@"0");
if (self = [super init]) {
NSLog(@"1");
}
return self;
}
- (void)loadView {
[super loadView];
NSLog(@"2");
}
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"3");
}
@end
Производит вывод на консоль:
0
2
3
1
Методы loadView и viewDidLoad, следовательно, не может сделать делегировать вызовы, как делегат, как правило, после вызова [super init], который (как показано выше) называется после loadView и viewDidLoad:
UIViewControllerSubClass *someViewController = [[UIViewControllerSubclass alloc] init];
[viewController setDelegate:self];
Если я хочу запустить код, который каким-либо образом настраивает ViewController, уведомляя делегата, как он идет, должен ли код находиться в методе init? Не является ли причиной того, что loadView уже разрешает запуск такого кода в соответствующий момент?
Он смотрит на меня, как я должен создать новый initWithDelegate метод, который устанавливает делегат Ивар перед тем вызывающего [супер INIT], это правильно, или я буду об этом не так?
Заранее спасибо :)
Примечание: viewDidUnload устарел с iOS 6.0. – Brainware