I'm fairly new to UI programming on the Mac and iPhone, and I've run across something that somewhat puzzles me.
A UIViewController has 3 methods that involve the initialization of it and its view:
- init (and init-like methods)
- loadView
- viewDidLoad (delegate method)
I'd expect these to occur in the order above. First UIViewController is alloc'ed by some other object, then init is immediately called (or some other init method, like initWithStyle).
Only once the object is initialized would I expect it to call its own loadView function, after which the view, once loaded, calls the viewDidLoad delegate method.
This doesn't happen, for instance:
@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
Produces the console output:
0
2
3
1
The loadView and viewDidLoad methods, therefore, cannot make delegate calls, as the delegate is usually set after the call to [super init], which (as shown above) is called after loadView and viewDidLoad have run:
UIViewControllerSubClass *someViewController = [[UIViewControllerSubclass alloc] init];
[viewController setDelegate:self];
If I want to run code that sets up the ViewController in some way, notifying the delegate as it goes, should the code reside in the init method? Isn't the reason for loadView existing to allow such code to be run at the appropriate moment?
It looks to me like I'll have to create a new initWithDelegate method which sets the delegate ivar before calling [super init], is this right, or am I going about this the wrong way?
Thanks in advance :)
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…