【问题标题】:How to get notified when NSWindow opens?如何在 NSWindow 打开时收到通知?
【发布时间】:2013-12-08 13:30:32
【问题描述】:

NSWindow 即将打开或刚刚打开时如何注意?也就是windowWillClose:委托方法的反面(同样NSWindowWillCloseNotification.的反面)

这与this question有关,但来自另一个方向。

背景是,我希望将一个窗口与主菜单上的刻度线结合起来(除其他外)。显示窗口时,应检查相应的 ̨ 菜单项,反之亦然。

【问题讨论】:

    标签: cocoa nswindow appkit nswindowcontroller


    【解决方案1】:

    窗口何时或如何可见通常不应该是个谜。它应该只在响应您自己的代码正在做的事情时发生。如果窗口位于 NIB 中并且标记为在启动时可见,则它会显示您的代码何时加载该 NIB。否则,它应该仅在您调用-orderOut: 以外的-order... 方法之一(例如-orderFront:)或-makeKeyAndOrderFront: 时显示。如果窗口由窗口控制器控制,那么如果您调用-[NSWindowController showWindow:],它将显示。等等。

    如果您确实觉得需要通知,您可以继承 NSWindow 并覆盖 -orderWindow:relativeTo:,如果 orderingMode 不是 NSWindowOut 并且窗口尚不可见,则发布您自己的通知。

    【讨论】:

    • 可能是窗口恢复的结果。 (另外我想知道first 是什么时候打开一个窗口,而不需要子类化窗口)。
    • 对于窗口恢复的情况,可以观察NSApplicationDidFinishRestoringWindowsNotification通知,查看窗口是否可见。
    • 最终,可以使窗口可见的方式的完整清单可作为支持需要窗口将订购通知的证据。
    • 有很多可能的方法,但一个人的特定代码只会使用一两个。正如我所说,在任何给定的特定情况下,何时或如何使窗口可见,这不应该是一个谜。
    【解决方案2】:

    在 macOS 10.10 中,通过调用 NSViewControllerviewWillAppearviewDidAppear 在一定程度上解决了这个问题。有一个NSViewController 子类并将其设置为窗口的contentViewController。然后它的viewWillAppear/viewDidAppear 实现可以发布窗口将(或确实)打开的通知。

    【讨论】:

    • 这还不够。每次窗口出现时都会触发通知,这也意味着应用程序被隐藏然后重新启用时。
    【解决方案3】:

    您可以将您的NSMenuItem 值绑定到NSWindows visible 绑定如果您在 IB 中执行此操作,则零代码行。

    可见: 一个布尔值,指定 NSWindow 是否可见。
    如果 visible 的计算结果为 YES,则 NSWindow 是可见的。
    可用性: 在 OS X v10.3 及更高版本中可用。

    请参阅NSWindow Binding Documentation 了解更多信息。

    您可以将NSMenuItem 值绑定绑定到现有类之一上的现有NSWindow 属性,或者将NSObjectController 添加到您的笔尖并将其内容设置为NSWindow 实例,然后绑定到控制器。

    在 Mac OS 10.9 上测试并确认。也适用于窗口最小化和恢复。

    【讨论】:

    • NSWindow 没有isVisible 属性,也没有visible 属性。它有一个isVisible 方法。它不保证该方法作为符合 KVO 的属性是可观察的。
    • @PeterHosey 确实有效,并且 isbinding documentation 保证
    • @PeterHosey,类似 getter 的方法的存在(并且-isVisible 绝对合格)足以确定属性的存在。 *Declared 属性更明确/格式更明确,但属性在将该功能添加到语言和运行时之前就已经存在。不过,您是对的,属性的存在并不意味着它符合 KVO,您必须假设属性不符合 KVO,除非它被记录在案。
    • @KenThomases 谢谢,当然你们在技术上是正确的关于不保证 KVO 合规性的方法,但是,我添加了 NSWindow 绑定的文档,这表明 visible 实际上是一个可行的密钥用于绑定。
    • @BradAllred,您链接到的文档显示NSWindow 具有visible 绑定,但这并不意味着它的“可见”属性符合KVO。该文档告诉您,您可以将NSWindow 的“可见”绑定绑定到符合KVO 的属性,这将导致窗口在该属性更改时显示或隐藏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多