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