2012-07-23 108 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]。)