Macos NSWindowController–;在显示窗口之前收到通知?
我有一个包含在nib文件中的窗口,由Macos NSWindowController–;在显示窗口之前收到通知?,macos,cocoa,nswindowcontroller,Macos,Cocoa,Nswindowcontroller,我有一个包含在nib文件中的窗口,由NSWindowController的自定义子类加载,如下所示: - (id)init { self = [super initWithWindowNibName:@"MyWindow"]; return self; } 我希望在此窗口变为可见之前初始化该窗口中的视图。现在我正在阅读一些用户默认设置,并在windowDidLoad中设置窗口的视图。但不幸的是,新初始化的值仅在窗口变为可见后应用,导致未初始化的值非常短暂地闪烁 windowW
NSWindowController
的自定义子类加载,如下所示:
- (id)init
{
self = [super initWithWindowNibName:@"MyWindow"];
return self;
}
我希望在此窗口变为可见之前初始化该窗口中的视图。现在我正在阅读一些用户默认设置,并在windowDidLoad
中设置窗口的视图。但不幸的是,新初始化的值仅在窗口变为可见后应用,导致未初始化的值非常短暂地闪烁
windowWillLoad
不工作,因为此时尚未从nib文件加载窗口
如何在显示窗口之前初始化它?您可以使用自己的方法
-(void)awakeFromNib
是进行视图设置的非常好的地方。在所有对象都已取消归档且出口已连接后,将调用该函数
更多信息通常,我使用此方法进行此类设置,但我认为它在这种情况下不起作用,因为我没有在nib文件中实例化此窗口控制器,而是在代码中,在单击某个菜单项时调用的操作方法中。然而,我刚刚尝试了它,它工作了,即使窗口控制器不是从nib文件中未归档的,而是以编程方式实例化的。这是怎么回事?因为您正在调用
initWithWindowNibName:
,self成为nib的所有者,加载时会调用awakeFromNib
。注意副作用:nib加载可能会推迟到显示窗口时。要真正知道谁调用了该方法,请在awakeFromNib
中放置一个断点,然后查看回溯。啊,我明白了。我对延迟加载没有意见毕竟,我只是使用awakeFromNib
来初始化该nib中包含的窗口的UI。正如您所建议的,在调试器中查看,表明只有在调用窗口控制器的showWindow:
方法之后,nib才真正加载,于是调用了awakeFromNib
。在大多数情况下,您不需要调用[super awakeFromNib]
(请参阅)。当以编程方式调用它时,我通常将nil
作为showWindow:
的参数传递。
- (IBAction)showWindow:(id)sender
{
// do whatever initialization
// or window UI setup you
// need to do right here
[super showWindow: sender];
}