Я довольно новичок в программировании пользовательского интерфейса на Mac и iPhone, и я столкнулся с чем-то, что меня несколько озадачило.
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, который устанавливает делегат ivar до , вызывающий [super init], это правильно, или я поступаю неправильно?
Заранее спасибо:)