Macos NSWindowController–;在显示窗口之前收到通知?

Macos NSWindowController–;在显示窗口之前收到通知?,macos,cocoa,nswindowcontroller,Macos,Cocoa,Nswindowcontroller,我有一个包含在nib文件中的窗口,由NSWindowController的自定义子类加载,如下所示: - (id)init { self = [super initWithWindowNibName:@"MyWindow"]; return self; } 我希望在此窗口变为可见之前初始化该窗口中的视图。现在我正在阅读一些用户默认设置,并在windowDidLoad中设置窗口的视图。但不幸的是,新初始化的值仅在窗口变为可见后应用,导致未初始化的值非常短暂地闪烁 windowW

我有一个包含在nib文件中的窗口,由
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];
}