2009-04-19 12 views
8

NSAlertクラスを使用してアプリケーションモーダルアラートを表示するCocoaアプリケーションがあります。私は警告ウィンドウを他のすべてのアプリケーションのウィンドウの上に浮かべたいと思います。 NSAlertでこれを行うことはできますか?それとも自分のウィンドウを実装する必要がありますか?NSAlertを使用してフローティングウィンドウを作成できますか?

この問題があるかどうかわかりませんが、アプリケーションはNSStatusItemとして実装されているエージェントアプリケーション(LSUIElementが該当)です。 (<here>を見て、ソースコードを含むアプリケーションについての詳細情報については、。)

ここで警告を表示するコードは次のとおりです。

- (void)showTimerExpiredAlert { 
    [NSApp activateIgnoringOtherApps:YES]; 

    NSAlert *alert = [[NSAlert alloc] init]; 
    [alert setAlertStyle:NSInformationalAlertStyle]; 
    [alert setMessageText:NSLocalizedString(@"Menubar Countdown Complete", @"Expiration message")]; 
    [alert setInformativeText:NSLocalizedString(@"The countdown timer has reached 00:00:00.", 
               @"Expiration information")]; 
    [alert addButtonWithTitle:NSLocalizedString(@"OK", @"OK button title")]; 
    [alert addButtonWithTitle:NSLocalizedString(@"Restart Countdown...", @"Restart button title")]; 

    NSInteger clickedButton = [alert runModal]; 
    [alert release]; 

    if (clickedButton == NSAlertSecondButtonReturn) { 
     // ... 
    } 
} 

私はrunModal呼び出し前にこれを入れて試してみた:

[[alert window] setFloatingPanel:YES]; 

私はこれも試してみた:

[[alert window] setLevel:NSFloatingWindowLevel]; 

しかしneitを他のアプリケーションのウィンドウをクリックすると、そのウィンドウが他のウィンドウの上に残ります。私はrunModalこれらの設定のいずれかを尊重しないと思う。

+1

runModalが呼び出されるたびにウィンドウレベルがリセットされます。 – cobbal

答えて

5

私はずっと前にこの正確なことについて私の脳を破壊しました。

これを動作させるには、NSApplicationをサブクラス化し、-sendEventをオーバーライドするしかありませんでした。 -sendEventでは、あなたの最初の呼び出しのスーパーの実装と思い、このような何か:

id *modalWindow = [self modalWindow]; 
if (modalWindow && [modalWindow level] != MY_DESIRED_MODAL_WINDOW_LEVEL) 
    [modalWindow setLevel: MY_DESIRED_MODAL_WINDOW_LEVEL]; 

をそれとは別にしても、これはかなりとってもうまくいきませんでした - アプリケーションを切り替えるとき - あなたはとにかくこれを行うにはしたくありませんでしたなぜなら、それは荒々しく粗いハックだからです。

そうですね、悲しいことに、あなた自身がNSAlertの独自のバージョンを作成する方が良いです。この可能性に本当に気を付けるならば、私はバグを報告します。 NSApplicationでは[[アラートウィンドウ]のsetLevel:someLevel]は尊敬されません。これを行うにはちょっとした自動レイアウト機能を使ってNSAlertを再構築する必要があります。

2

私がやったことは、NSAlertを放棄し、代わりにNIBから警告メッセージNSWindowを読み込みました。ここで

は、ウィンドウを表示するコードです:

- (void)showAlert { 
    NSWindow *w = [self window]; 
    [w makeFirstResponder:nil]; 
    [w setLevel:NSFloatingWindowLevel]; 
    [w center]; 
    [w makeKeyAndOrderFront:self]; 
} 

これは、それがまた浮かぶことを除いて、それは、警告のように動作させるためのもの、およびメニュー項目がしばらく選択することができますので、それは、モーダルではありませんそれはアップです。

他に何かすべきことはありますか?

関連する問題