我正在使用 Xcode5.1 在 MacOS X 上开发一个应用程序
每当用户打开或显示 NSWindowController 时我想触发一个操作
我发现的是
但与 iOS 不同的是:我的方法......
因为即使我关闭 NSWindowController
[NSWindowController 关闭];
如果我再次打开它,它不会触发我的 windowDidLoad、windowDidAppear 或 awakeFromNib 操作
现在我需要像它们一样的东西,相当于什么,它一定是某种东西
预先感谢您的支持
是的,NSWindowController 中没有这么方便的方法。让我解释一下原因。
iOS 视图控制器和 OS X 窗口控制器之间存在差异:在 iOS 中,视图控制器可以全屏显示或完全从屏幕隐藏。就这样。 OS X 中的窗口具有更多的自由度:它可以显示、隐藏、调整大小、最小化/恢复、被其他应用程序的窗口覆盖、全屏显示、转到另一个屏幕(在多显示器配置中)等。用于跟踪所有这个activity,NSWindow有一个委托(它会自动映射到xib中相应的NSWindowController上)。看一眼NSWindowDelegate https://developer.apple.com/library/mac/documentation/cocoa/reference/NSWindowDelegate_Protocol/Reference/Reference.html文档。因此,iOS“出现”和 OS X 的一系列操作之间没有直接的行为映射。但我们可以尝试使用最近的可能事件。
对于您的情况(在窗口可见时执行某些操作),我可以提供两种不同的方法。
首先,覆盖showWindow
NSWindowController 子类中的操作:
- (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
flag没有关闭,没有调用对应的委托方法;他们只是从屏幕上删除不关闭)。此方法使我们能够跟踪这些情况:
- (void)windowDidChangeOcclusionState:(NSNotification *)notification
{
if (self.window.occlusionState & NSWindowOcclusionStateVisible)
{
// Appear code here
}
else
{
// Disappear code here
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)