我正在使用Xcode5.1在MacOS X上开发应用程序

并且我想在用户每次打开或显示NSWindowController时触发一个动作
我发现的只是


windowDidLoad
windowWillLoad
awakeFromNib


但没有什么比iOS:我的方法...


viewWillAppear
viewDidAppear


因为即使我关闭了NSWindowController

[NSWindowController关闭];

如果我再次打开它,它不会从windowDidLoad,windowDidAppear或awakeFromNib触发我的操作

现在我需要像他们这样的东西,什么是等效的,它一定是

预先感谢您的支持

最佳答案

是的,NSWindowController中没有这样方便的方法。让我解释一下原因。
iOS视图控制器和OS X窗口控制器之间存在区别:在iOS中,视图控制器可以全屏显示或完全隐藏在屏幕之外。就这样。 OS X中的窗口具有更多自由度:可以显示,隐藏,调整大小,最小化/还原,由其他应用程序的窗口覆盖,全屏显示,转到另一个屏幕(在多显示器配置中)等。在此活动中,NSWindow具有一个委托(该委托会自动映射到xib中相应的NSWindowController上)。看看NSWindowDelegate文档。因此,iOS“出现”和OS X动作之间没有直接的行为映射。但是我们可以尝试使用最接近的事件。

对于您的情况(在窗口显示一些内容),我可以提供2种不同的方法。
首先,在您的NSWindowController子类中覆盖showWindow操作:

- (IBAction)showWindow:(id)sender
{
    [super showWindow:sender];

    // your code here
}


这样,每次创建/显示窗口时都会调用您的代码。

第二,使用委托方法:

- (void)windowDidChangeOcclusionState:(NSNotification *)notification
{
    // notification.object is the window that changed its state.
    // It's safe to use self.window instead if you don't assign one delegate to many windows
    NSWindow *window = notification.object;

    // check occlusion binary flag
    if (window.occlusionState & NSWindowOcclusionStateVisible)
    {
        // your code here
    }
}


这样,每当窗口(或其一部分)可见时,就会调用您的代码。例如,如果用户最小化了位于您的窗口上方的另一个窗口(或将其移至某处),则会发生此事件。当您想在不可见的窗口中暂停动画/计时器/等以节省一些CPU时,通常是这样:)
如果您需要在窗口消失时做一些事情,这也是一种非常有用的方法(例如,未启用hidesOnDeactivate标志的窗口未关闭,并且不会调用相应的委托方法;它们只是从屏幕上移除而没有关闭)。这种方法使我们可以跟踪以下情况:

- (void)windowDidChangeOcclusionState:(NSNotification *)notification
{
    if (self.window.occlusionState & NSWindowOcclusionStateVisible)
    {
        // Appear code here
    }
    else
    {
        // Disappear code here
    }
}

关于macos - NSWindowController上的viewWillAppear或viewDidAppear,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24086398/

10-09 16:30