2

私は 2 つの NSWindows を持っています。ウィンドウ A はレベル 0、ウィンドウ B はレベル 1 です。B をフローティング ウィンドウとして使用しています。

これは、A をモーダル ウィンドウとして配置する (つまり、runModalForWindow:A メッセージを NSApplication に送信する) までは、期待どおりに機能します。このとき、B は常に A の後ろにあります。

A がモーダル ウィンドウとして実行されている場合でも、B を A の上に置く方法はありますか?

助けてくれてありがとう。

4

4 に答える 4

2

フローティング ウィンドウを前面に配置するには、 を使用します[myfloater setLevel: NSModalPanelWindowLevel+1]

他の人は、フローターとのやり取りに問題があると言っていますが、私はそれを実行し、うまくいきました. (私のフローターはNSPanelプレーンではなく「ユーティリティ パネル」スタイルを使用しNSWindowていますが、それが重要かどうかはわかりません。また、 と言う必要があるかもしれません[myPanel setWorksWhenModal: YES]。)

于 2015-04-30T20:09:26.107 に答える
1

私の知る限り、それは不可能です。

Apple クラスリファレンスから:

NSApplication runModalForWindow:

このメソッドは、指定されたウィンドウのモーダル イベント ループを同期的に実行します。指定されたウィンドウを表示し、それをキーにして、実行ループを開始し、そのウィンドウのイベントを処理します。(ウィンドウを自分で表示する必要はありません。) アプリケーションがそのループにある間、ウィンドウに関連付けられていない限り、他のイベント (マウス、キーボード、またはウィンドウを閉じるイベントを含む) には応答しません。また、モーダル実行ループに関連付けられていないタスク (タイマーの起動など) も実行しません。つまり、このメソッドは、イベントを処理し、モーダル ウィンドウに関連付けられたアクション メソッドにディスパッチするのに十分な CPU 時間を消費します。

これにより、ウィンドウ A がキー ウィンドウになり、常にアプリの他のウィンドウの上に表示されます。これがモーダルウィンドウの仕組みだと思います。

NSPopover別の方法として、ユーザーに対して明確に存在するが、アプリケーションを強制的にモーダル状態にしない を使用することを検討できます。

利用可能なさまざまなオプションに関するガイドラインについては、Apple ドキュメントのこのページを参照してください。

于 2012-07-24T00:22:24.813 に答える
0

orderFront:orderFrontRegardless、またはを使用orderFront:relativeTo:して、B を A の前に移動させることができます。ただし、A がモーダルであるため、B とやり取りできないため、B で実行できるタスクの数は不明です。

于 2015-04-09T10:57:23.850 に答える
0

ウィンドウレベルを NSScreenSaverWindowLevel に設定すると、常に一番上になると思います。

于 2012-07-24T00:19:39.570 に答える