2012-07-23 79 views
2

我有两个NSWindows。窗口A级别为0,窗口B级别为1.我使用B作为浮动窗口。Cocoa/ObjC:在模态窗口上放置一个浮动窗口

这个按预期工作,直到我把A作为一个模态窗口(即发送runModalForWindow:一条消息给NSApplication)。然后B总是在后面A.

有没有一种方法可以使B超过A,即使A作为模态窗口运行?

非常感谢您的帮助。

回答

0

我想如果你将窗口级别设置为NSScreenSaverWindowLevel,它将永远在最前面。

1

AFAIK是不可能的。

从Apple类参考:

的NSApplication runModalForWindow:

该方法运行指定的窗口 同步模态事件循环。它显示指定的窗口,使其成为关键,启动运行循环并处理该窗口的事件。 (您不需要 来自己显示窗口。)虽然应用程序在该循环中,但它不响应任何其他事件(包括鼠标,键盘或窗口关闭事件),除非它们与窗口关联。它 也不执行与模态运行循环相关联的不是 的任何任务(例如触发定时器)。换句话说,这种方法 仅消耗足够的CPU时间来处理事件,并将它们分派到与模态窗口相关联的操作方法 。

鉴于此,您的窗口A将成为关键窗口,并将始终显示在您应用的任何其他窗口的顶部。我认为这是模态窗口应该如何工作。

作为替代方案,您可以考虑使用NSPopover,它对用户有明确的存在,但不会强制您的应用程序进入模态。

从Apple文档指南中查看this page了解各种可用的选项。

0

您可以使用orderFront:,orderFrontRegardlessorderFront:relativeTo:使B移动到A的前面。但不知道您在B中可以执行多少任务,因为A是模态的事实,您将不会能够与B交互。

1

要将您的浮动窗口放在前面,请使用[myfloater setLevel: NSModalPanelWindowLevel+1]

其他人告诉你,你将无法与浮动相互作用,但我已经做到了,它为我工作。 (我的Floater使用“Utility Panel”风格的NSPanel而不是普通的NSWindow,但我不确定这很重要,您可能还需要说[myPanel setWorksWhenModal: YES]。)