NSWindowController上的viewWillAppear或viewDidAppear

时间:2014-06-06 16:15:49

标签: macos cocoa xcode5

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

并且每次用户打开或显示NSWindowController时都会触发一个动作 我找到的只是

  • windowDidLoad
  • windowWillLoad
  • awakeFromNib

但在iOS中没有任何意义:我的方法......

  • viewWillAppear中
  • viewDidAppear

因为即使我用

关闭NSWindowController

[NSWindowController close];

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

现在我需要像他们这样的东西,等同于什么,它必须是某种东西

提前感谢支持

2 个答案:

答案 0 :(得分:17)

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

对于你的情况(在窗口做一些事情变得可见),我可以提供两种不同的方法 首先,覆盖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
    }
}

答案 1 :(得分:0)

如果您真的需要知道Windows的遮挡状态,请使用@Cemen的答案,否则,我建议您只使用

viewWillAppear
viewDidAppear

等您的窗口contentViewController。只是将其子类化并在那里重写即可。