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 -init
和before -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的主要内容,如果未能解决你的问题,请参考以下文章
Swift 2.0 和 Parse - 'init()' 不可用:使用 'init(domain:code:userInfo:)'
ios:关于init(frame :)和init的问题?(编码器:)
python基础:__init__.py和__init__函数的作用