init和awakeFromNib

Mat*_*oal 15 macos cocoa

我想了解为什么如果我尝试在init方法中为对象(如NSButton)设置值(即setAlphaValue或setTitle)没有任何反应,但如果我在awakeFromNib中调用setter函数它可以正常工作.

@interface appController : NSObject {
    NSButton *btn;
}
@end;

@implementation appController
-(void)awakeFromNib {
   //it works
   [btn setTitle:@"My title"];
}

-(id)init { 
    self = [super init];
    if(self){
        //it doesn't works
        [btn setTitle:@"My title"];
    }
}
@end
Run Code Online (Sandbox Code Playgroud)

小智 42

奥特莱斯设置之后 -init之前 -awakeFromNib.如果您想访问插座,则需要在-awakeFromNib设置插座后执行该操作或执行其他方法(例如-[NSWindowController windowDidLoad]).

加载nib文件时:

  1. 在笔尖文件对象被分配/初始化,在接受-init,-initWithFrame:-initWithCoder:
  2. 重新建立所有连接.这包括操作,出口和绑定.
  3. -awakeFromNib 被发送到接口对象,文件所有者和代理对象.

您可以在" 资源编程指南"中阅读有关nib加载过程的更多信息.

  • 我想补充一点:"无法保证nib加载代码调用对象的awakeFromNib方法的顺序.在OS X中,Cocoa尝试最后调用File的Owner的awakeFromNib方法,但不保证该行为.你需要在加载时进一步配置nib文件中的对象,最合适的时间是在你的nib-loading调用返回之后.此时,所有对象都被创建,初始化并准备好使用.来自本答案中的资源编程指南. (3认同)

Eik*_*iko 5

在初始化时,视图将无法正确设置,并且插座未连接.这就是你awakeFromNib:在这种情况下使用的原因- 所有东西都已设置好并可以使用.