我正在使用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/