2010-12-19 9 views
6

Mam NSStatusItem, który jest poprawnie wyświetlany w MenuBar. Jedna z pozycji (po kliknięciu) wyświetla modalny NSWindow z mojej aplikacji, który ma wykonać jednorazowe zadanie, a następnie znika. (Np. Użytkownik wprowadza mały fragment tekstu, klika "Zapisz", a modalny NSWindow znika.)Wyświetlanie modalnego NSWindow, bez aktywacji innych okien aplikacji

Problem występuje, gdy aplikacja działa w tle. Okno modalne wyświetla się poprawnie powyżej jakiejkolwiek aplikacji uruchomionej na pierwszym planie, ale gdy użytkownik kliknie przycisk "Zapisz", pozostałe okna aplikacji również stają się aktywne. Jest to niepożądane, ponieważ użytkownik musi następnie powrócić do dowolnej aplikacji, z której korzystał. (Niszczenie wygodę NSStatusItem.) Jestem wyświetlając okno modalne używając:

[myWindow setFrame:finalRect display:YES animate:NO]; 
[myWindow setLevel:NSPopUpMenuWindowLevel]; 
[NSApp runModalForWindow:myWindow]; 

Czy istnieje jakiś sposób, aby zapobiec kliknięcia/wydarzenia w moim okienko z powodując resztę wniosku do aktywności? Lub sposób na poinformowanie NSApp o tym, że ten konkretny panel nie powinien automatycznie aktywować reszty aplikacji? Dzięki!

Odpowiedz

16

Zamiast tworzyć NSWindow utwórz NSPanel ze stylem NSNonactivatingPanelMask. Następnie można wykonać zwykłe makeKeyAndOrderFront: i orderOut:, aby pokazać/ukryć panel w razie potrzeby.

+0

Działa idealnie (i po prostu), dzięki! –

1

Rozwiązanie przez Kena Tomaszom na liście kakao-dev kilka lat temu wygląda zastosowanie także tutaj:

[[NSApplication sharedApplication] hide:self]; 
[[NSApplication sharedApplication] performSelector:@selector (unhideWithoutActivation) withObject:nil afterDelay:0.05]; 

co teoretycznie mówi aplikację do ukrycia się i odkryć w dolnej części okna stosie.

Można także przechwytywać zdarzenia kliknięcia myszy i użyć [NSApp preventWindowOrdering]

+0

Dzięki, dam jej spróbować i powiedzieć wam, jak to działa. –

+0

Nie, kliknięcie w dowolnym miejscu w tym oknie nadal przenosi powiązane okna aplikacji na pierwszy plan. –

0

Można spróbować czegoś takiego:

... 
if ([NSApp isHidden]) 
    [myWindow makeKeyAndOrderFront:self]; 
else 
    [NSApp runModalForWindow:myWindow]; 
... 

i kiedy wykończenie:

... 
if ([NSApp isHidden]) 
    [myWindow orderOut:self]; 
else 
    [NSApp stopModal]; 
... 
Powiązane problemy