init 和 awakeFromNib

Posted

技术标签:

【中文标题】init 和 awakeFromNib【英文标题】:init and awakeFromNib 【发布时间】:2011-06-22 08:19:39 【问题描述】:

我想了解为什么如果我尝试在 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

【问题讨论】:

【参考方案1】:

Outlets 设置在after -initbefore -awakeFromNib。如果您想访问 outlet,您需要在 -awakeFromNib 或设置 outlet 后执行的其他方法(例如 -[NSWindowController windowDidLoad])中执行此操作。

加载 nib 文件时:

    nib 文件中的对象被分配/初始化,接收-init-initWithFrame:-initWithCoder: 重新建立所有连接。这包括动作、出口和绑定。 -awakeFromNib 被发送到接口对象、文件所有者和代理对象。

您可以在Resource Programming Guide 中阅读有关笔尖加载过程的更多信息。

【讨论】:

谢谢!完美的答案(我需要再等几分钟才能接受它:)) 我想补充一点:“nib加载代码调用对象的awakeFromNib方法的顺序不能保证。在OS X中,Cocoa尝试最后调用File's Owner的awakeFromNib方法但不保证这种行为。如果您需要在加载时进一步配置 nib 文件中的对象,最合适的时间是在您的 nib-loading 调用返回之后。此时,所有对象都已创建,已初始化,可以使用了。”来自此答案中的资源编程指南。【参考方案2】:

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

【讨论】:

以上是关于init 和 awakeFromNib的主要内容,如果未能解决你的问题,请参考以下文章

systemd 和 init

Swift 2.0 和 Parse - 'init()' 不可用:使用 'init(domain:code:userInfo:)'

ios:关于init(frame :)和init的问题?(编码器:)

python基础:__init__.py和__init__函数的作用

Swift:init 中 super.init 和 self.attribute 的顺序

Python中:self和__init__的含义 + 为何要有self和__init__