Cocoa / ObjC:在模态窗口上方放置一个浮动窗口

时间:2012-07-23 23:48:14

标签: objective-c macos cocoa

我有两个NSWindows。窗口A的级别为0,窗口B的级别为1.我使用B作为浮动窗口。

这可以正常工作,直到我将A作为模态窗口(即发送runModalForWindow:向NSApplication发送消息)。然后B总是落后于A.

即使A作为模态窗口运行,有没有办法可以让B高于A?

非常感谢您的帮助。

4 个答案:

答案 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:orderFrontRegardlessorderFront:relativeTo:将B移到A前面。但不确定您可以在B中执行多少任务,因为事实上,A是模态的,你无法与B互动。