init and awakeFromNib
I'd like understand why if i try to set value (I.e. setAlphaValue or setTitle) for an object (like a NSButton) in init method nothing happen, but if i call setter function in awakeFromNib it works correctly.
@interface appController : NSObject {
NSButton *btn;
}
@end;
@implementation appController
-(void)awakeFromNib {
//it works
[btn setTitle:@"My title"];
}
-(id)ini开发者_C百科t {
self = [super init];
if(self){
//it doesn't works
[btn setTitle:@"My title"];
}
}
@end
Outlets are set after -init
and before -awakeFromNib
. If you want to access outlets, you need to do that in -awakeFromNib
or another method that’s executed after the outlets are set (e.g. -[NSWindowController windowDidLoad]
).
When a nib file is loaded:
- Objects in the nib file are allocated/initialised, receiving either
-init
,-initWithFrame:
, or-initWithCoder:
- All connections are reestablished. This includes actions, outlets, and bindings.
-awakeFromNib
is sent to interface objects, file’s owner, and proxy objects.
You can read more about the nib loading process in the Resource Programming Guide.
When in init, the view will not be set up properly, and the outlets aren't connected. That's why you use awakeFromNib:
in this case - everything is set up and ready to be used.
精彩评论