我有两个 NSWindows。级别 0 的窗口 A,级别 1 的窗口 B。我使用 B 作为浮动窗口。
在我将 A 作为模式窗口(即,将 runModalForWindow:A 消息发送到 NSApplication)之前,这将按预期工作。那么B总是在A之后。
有没有办法让 B 高于 A,即使 A 作为模式窗口运行?
非常感谢您的帮助。
我有两个 NSWindows。级别 0 的窗口 A,级别 1 的窗口 B。我使用 B 作为浮动窗口。
在我将 A 作为模式窗口(即,将 runModalForWindow:A 消息发送到 NSApplication)之前,这将按预期工作。那么B总是在A之后。
有没有办法让 B 高于 A,即使 A 作为模式窗口运行?
非常感谢您的帮助。
要将浮动窗口放在前面,请使用[myfloater setLevel: NSModalPanelWindowLevel+1]
.
其他人告诉您,您将无法与漂浮物互动,但我已经做到了,它对我有用。(我的浮动使用NSPanel
“实用面板”样式而不是 plain NSWindow
,但我不确定这是否重要。您可能还需要说[myPanel setWorksWhenModal: YES]
。)
AFAIK 那是不可能的。
来自 Apple 类参考:
NSApplication runModalForWindow:
此方法同步运行指定窗口的模态事件循环。它显示指定的窗口,使其成为关键,启动运行循环,并处理该窗口的事件。(您不需要自己显示窗口。)当应用程序处于该循环中时,它不会响应任何其他事件(包括鼠标、键盘或窗口关闭事件),除非它们与窗口相关联。它也不执行任何与模态运行循环无关的任务(例如触发计时器)。换句话说,此方法仅消耗足够的 CPU 时间来处理事件并将它们分派到与模态窗口关联的操作方法。
鉴于此,您的窗口 A 将成为关键窗口,并将始终显示在应用程序的任何其他窗口之上。我认为这就是模态窗口应该如何工作的。
作为替代方案,您可以考虑使用NSPopover
对用户有明确存在但不会强制您的应用程序进入模态状态的方法。
从 Apple 文档中查看此页面,了解有关您可以使用的各种选项的指南。
我认为如果您将窗口级别设置为 NSScreenSaverWindowLevel,它将始终位于顶部。
您可以使用orderFront:
,orderFrontRegardless
或orderFront:relativeTo:
, 将 B 移动到 A 前面。但是不确定您可以在 B 中执行多少任务,因为 A 是模态的,您将无法与 B 交互。