我正在用Xcode5.1在MacOS X上开发一个应用程序
每当用户打开或显示一个NSWindowController时,我都想触发一个操作
但与iOS不同:我的方法.
因为即使我关闭了一个NSWindowController
NSWindowController关闭;
如果我再次打开它,它不会触发windowDidLoad、windowDidAppear或awakeFromNib的操作
现在我需要像他们一样的东西,什么是等价物,一定是
谢谢你的支持
发布于 2014-09-22 19:34:14
是的,在NSWindowController中没有这样方便的方法。让我解释一下原因。
iOS视图控制器和OS窗口控制器有一个不同之处:在iOS中,视图控制器可以显示全屏或完全隐藏在屏幕上。就这样。OS中的窗口具有更多的自由度:可以显示、隐藏、调整大小、最小化/恢复、被其他应用程序的窗口覆盖、转到全屏、转到另一个屏幕(在多监视器配置中)等等。为了跟踪所有这些活动,NSWindow有一个委托(在xib中自动映射到相应的NSWindowController上)。看看NSWindowDelegate文档。因此,在iOS“出现”和OS一系列操作之间没有直接的行为映射。但我们可以尝试使用最近的可能事件。
对于你的情况(在窗口做一些事情变得可见),我可以提供两种不同的方法。
首先,在您的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
}
}这样,每当窗口(或其部分)变得可见时,您的代码就会被调用。例如,如果用户最小化了窗口上的另一个窗口(或将其移到某个地方),则可能发生此事件。通常情况下,要在不可见窗口中挂起动画/计时器/etc以保存一些cpu :)
如果需要在窗口消失时执行某些操作,这也是非常有用的方法(例如,带有启用hidesOnDeactivate标志的窗口不关闭,也不调用相应的委托方法;它们只是从屏幕上删除而没有关闭)。这种方法使我们能够跟踪这些情况:
- (void)windowDidChangeOcclusionState:(NSNotification *)notification
{
if (self.window.occlusionState & NSWindowOcclusionStateVisible)
{
// Appear code here
}
else
{
// Disappear code here
}
}发布于 2020-12-10 07:54:26
如果您真的需要知道窗口遮挡状态与@Cemen的答案相匹配,我建议您只使用
viewWillAppear
viewDidAppear等等,您的窗口contentViewController。只需要子类,然后在那里重写它。
https://stackoverflow.com/questions/24086398
复制相似问题