cocoa - 带选项的窗口编号 : on Yosemite fails to return NSPanel windows of my application

标签 cocoa nswindow z-order nspanel

我有一个基于文档的应用程序,有一个主文档窗口和几个显示相关信息的“卫星”NSPanel 窗口。它们不是 float 的,它们可以(并且确实)成为关键,并且似乎与主窗口位于同一层。

我尝试实现显示/隐藏操作,如下所示:如果面板不可见 - 显示它。如果它可见,但不是前面 - 将其设置为前面。如果它是可见的并且在前面 - 将其隐藏。

为此,我需要知道 NSPanel 是否是“最前面的”。遗憾的是没有 NSWindow API 可以实现这一点。我尝试使用 windowNumbersWithOptions 来比较面板的 z 顺序。

-(void) togglePanelVisibility:(PMXPanelController *)panelController {
    NSPanel *panel = [panelController window];
    if ([panel isVisible]) {
        NSArray *windowNumbers = [NSWindow windowNumbersWithOptions:0];
        if ([panel windowNumber] == [[windowNumbers firstObject] integerValue]) {
            [panel orderOut:self];
        }
        else {
            [panel makeKeyAndOrderFront:self];
        }
    } else
        [panelController showWindow:self];
}

唉,我收到的数组只包含一个数字 - 用于我的主文档窗口。我可以在“窗口”菜单中看到我的面板,我可以单击它们将它们带到前面,我可以关闭它们并使用它们 - 但我无法通过 windowNumbersWithOptions 获取它们的号码:

有人有想法吗?

最佳答案

它没有在任何地方说明这一点,但从 NSWindowNumberListAllApplications 返回的少量窗口来看,windowNumbersWithOptions 只返回正常级别的窗口或应用一些一种不包括其他窗口的过滤。最好的选择是 orderedWindows NSApplication 实例的属性,但既然您提到了面板,请注意:

Only windows that are typically scriptable are included in the array. For example, panels are not included.

请记住,这两种方法都依赖于 Quartz API,并且可能使用 CGWindowListCopyWindowInfo – 在最坏的情况下,您可以转到较低的级别并使用它。

关于cocoa - 带选项的窗口编号 : on Yosemite fails to return NSPanel windows of my application,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30900230/

相关文章:

html - css transform :scale(2, 2) 在其他图片后面弹出

javascript - 如何将点击事件映射到多层中的元素?

objective-c - ManagedObjectContext 从 AppDelegate 返回 nil

.net - 为什么我们激活它时Word没有 "come to front"?

xcode - Cocoa 中的拖放 (<NSDraggingDestination>) 不起作用

macos - NSPopOver 和 NSViewController - 拖动以调整大小

objective-c - 固定对象位于 NSWindow 右侧

cocoa - 禁用窗口拉伸(stretch) Cocoa?

iphone - 查找谁拥有对象的保留计数

objective-c - 有没有办法通过 XPC 传递任意结构?