Cocoa 如何在窗口打开时获得通知?

Cocoa 如何在窗口打开时获得通知?,cocoa,nswindow,appkit,nswindowcontroller,Cocoa,Nswindow,Appkit,Nswindowcontroller,当NSWindow即将打开或刚刚打开时,如何注意?也就是说,windowWillClose的对立面:delegate方法(同样,与NSWindowWillCloseNotification的对立面。) 这是相关的,但从另一个方向 背景是,我正在寻找一个在主菜单上有记号的窗口(除其他外)。当显示窗口时,应检查相应的̨菜单项,反之亦然。如果在IB中执行此操作,则可以将NSMenuItem值绑定到NSWindowsvisible绑定零行代码 可见: 一个布尔值,指定NSF窗口是否可见。 如果visib

NSWindow
即将打开或刚刚打开时,如何注意?也就是说,
windowWillClose的对立面:
delegate方法(同样,与
NSWindowWillCloseNotification的对立面。

这是相关的,但从另一个方向


背景是,我正在寻找一个在主菜单上有记号的窗口(除其他外)。当显示窗口时,应检查相应的̨菜单项,反之亦然。

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

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

有关更多信息,请参阅

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


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

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


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

macOS 10.10,通过调用
NSViewController
viewwillbeen
viewdidebeen
可以在一定程度上解决这一问题。拥有一个
NSViewController
子类,并将其设置为窗口的
contentViewController
。然后它的
视图将出现
/
视图显示
实现可以发布窗口将(或确实)打开的通知。

NSWindow既没有
isVisible
属性,也没有
visible
属性。它有一个
isVisible
方法。它不保证该方法作为兼容KVO的属性是可观察的。@PeterHosey是有效的,并且由@PeterHosey保证,类似getter的方法(并且
-isVisible
明确限定)的存在足以确定属性的存在*声明的属性更显式/格式,但在将该特性添加到语言和运行时之前就存在属性。不过,您是对的,仅仅存在一个属性并不意味着它符合KVO,您必须假设一个属性不符合KVO,除非有文档证明它符合KVO。@Kenthomass谢谢,当然,对于不保证KVO符合性的方法,你们在技术上是正确的,我添加了
NSWindow
绑定的文档,这表明
visible
实际上是一个可行的绑定键。@BradAllred,您链接的文档显示
NSWindow
具有
visible
绑定,但这并不意味着它的“visible”属性符合KVO。该文档告诉您,您可以将
NSWindow
的“可见”绑定绑定到符合KVO的属性,这将导致该属性更改时显示或隐藏该窗口。这可能是窗口恢复的结果。(我还想知道
第一次打开窗口的时间是什么时候,而不需要对窗口进行子类化)。对于窗口恢复的情况,您可以观察
NSApplicationIDFinishRestoringWindowsNotification
通知并检查窗口是否可见。最终,窗口显示方式的完整清单可作为支持窗口需要的证据,将在通知中排序。可能的方式有很多,但只有一种或两种用于特定代码。正如我所说,在任何特定情况下,窗户何时或如何可见都不应该是一个谜,这本身是不够的。每次窗口出现时都会触发通知,也就是说,当应用程序被隐藏然后重新启用时。