gpt4 book ai didi

macos - NSWindowController 上的 viewWillAppear 或 viewDidAppear

转载 作者:行者123 更新时间:2023-12-03 16:03:01 25 4
gpt4 key购买 nike

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

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

  • windowDidLoad
  • 窗口将加载
  • awakeFromNib

但与 iOS 不同:我的方法...

  • 查看将出现
  • viewDidAppear

因为即使我用

关闭 NSWindowController

[NSWindowController 关闭];

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

现在我需要像它们一样的东西,等价物是什么,它一定是某种东西

提前感谢您的支持

最佳答案

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

对于您的情况(在窗口可见时执行某些操作),我可以提供两种不同的方法。
首先,重写 NSWindowController 子类中的 showWindow 操作:

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

// your code here
}

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

或者第二,使用委托(delegate)方法:

- (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标志的窗口未关闭并且不调用相应的委托(delegate)方法;它们只是从屏幕上删除但未关闭)。此方法使我们能够跟踪这些情况:

- (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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com