NSAlertは、フローティングウィンドウを作成するために使用することはできますか?

StackOverflow https://stackoverflow.com/questions/765416

  •  12-09-2019
  •  | 
  •  

質問

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

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

ここでは、アラートを表示するコードがあります:

- (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];

しかし、私は別のアプリケーションのウィンドウをクリックした場合、それらのいずれもが他人上記ウィンドウの滞在になります。私はrunModalがちょうどそれらの設定のいずれかを尊重していない疑います。

役に立ちましたか?

解決

私はしばらく前にこの正確な事についての私の脳を難破ます。

私はこれが(ソートの)仕事を得ることができる唯一の方法は、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ので光栄とそれだけでこれを行うことができるように、そのすべての小ぎれいな自動レイアウト機能での再構築NSAlertを持っている廃棄物ですされていない

他のヒント

私は何をやってしまったことはNSAlertを放棄し、代わりに私がNIBからalertish NSWindowをロードしました。

ここでウィンドウを表示するコードがあります:

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

このは、それがアップしている間、メニュー項目を選択することができますので、それも浮くことを除いて、それは、警告のように行動し、それはモーダルされていないようにすることを目的とします。

私がやるべき何か他のものはありますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top