首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >viewWillAppear或viewDidAppear on NSWindowController

viewWillAppear或viewDidAppear on NSWindowController
EN

Stack Overflow用户
提问于 2014-06-06 16:15:49
回答 2查看 5.8K关注 0票数 19

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

每当用户打开或显示一个NSWindowController时,我都想触发一个操作

  • windowDidLoad
  • windowWillLoad
  • awakeFromNib

但与iOS不同:我的方法.

  • viewWillAppear
  • viewDidAppear

因为即使我关闭了一个NSWindowController

NSWindowController关闭;

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

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

谢谢你的支持

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-22 19:34:14

是的,在NSWindowController中没有这样方便的方法。让我解释一下原因。

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

对于你的情况(在窗口做一些事情变得可见),我可以提供两种不同的方法。

首先,在您的showWindow子类中重写NSWindowController操作:

代码语言:javascript
复制
- (IBAction)showWindow:(id)sender
{
    [super showWindow:sender];

    // your code here
}

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

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

代码语言:javascript
复制
- (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标志的窗口不关闭,也不调用相应的委托方法;它们只是从屏幕上删除而没有关闭)。这种方法使我们能够跟踪这些情况:

代码语言:javascript
复制
- (void)windowDidChangeOcclusionState:(NSNotification *)notification
{
    if (self.window.occlusionState & NSWindowOcclusionStateVisible)
    {
        // Appear code here
    }
    else
    {
        // Disappear code here
    }
}
票数 31
EN

Stack Overflow用户

发布于 2020-12-10 07:54:26

如果您真的需要知道窗口遮挡状态与@Cemen的答案相匹配,我建议您只使用

代码语言:javascript
复制
viewWillAppear
viewDidAppear

等等,您的窗口contentViewController。只需要子类,然后在那里重写它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24086398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档