Niestandardowy NSView w NSMenuItem nie odbiera zdarzeń myszy

Mam NSMenu wyskakujące z NSStatusItem za pomocą popUpStatusItemMenu. Te NSMenuItems pokazują kilka różnych łączy, a każdy z nich jest połączony z setAction: do metody openLink: celu. Ten układ działa dobrze przez długi czas. Użytkownik wybiera łącze z menu i metoda openLink: następnie zajmuje się tym.

Niestety niedawno zdecydowałem się na eksperyment z użyciem metody setView: NSMenuItem, aby zapewnić ładniejszy interfejs. Zasadniczo po prostu przestałem ustawiać tytuł, stworzyłem NSMenuItem, a następnie użyłem setView: aby wyświetlić własny widok. Działa to doskonale, elementy menu wyglądają świetnie, a mój widok niestandardowy jest wyświetlany.

Jednak gdy użytkownik wybierze element menu i zwolni mysz, akcja przestanie działać (tzn. OpenLink: nie jest wywoływana). Jeśli po prostu komentuję setView: call, wtedy akcje działają ponownie (oczywiście, pozycje menu są puste, ale akcja jest wykonywana poprawnie). Moje pierwsze pytanie brzmi zatem, dlaczego ustawienie widoku powoduje przerwanie akcji NSMenuItem.

Nie ma problemu, pomyślałem, naprawię to, wykrywając zdarzenie mouseUp w moim widoku niestandardowym i wywołując stamtąd metodę działania. Dodałem tę metodę do mojego widoku niestandardowego:

- (void)mouseUp:(NSEvent *)theEvent {
  NSLog(@"in mouseUp");
  }

Nie ma kości! Ta metoda nigdy nie jest wywoływana.

Mogę jednak ustawić śledzenie poprawek i odbierać wpisane myszy: zdarzenia. Umieściłem kilka testów w mojej procedurze mouseEntered w następujący sposób:

if ([[self window] ignoresMouseEvents]) {  NSLog(@"ignoring mouse events");  }
else {  NSLog(@"not ignoring mouse events");  }
if ([[self window] canBecomeKeyWindow]) {  dNSLog((@"canBecomeKeyWindow"));  }
else {  NSLog(@"not canBecomeKeyWindow");  }
if ([[self window] isKeyWindow]) {  dNSLog((@"isKeyWindow"));  }
else {  NSLog(@"not isKeyWindow");  }

I otrzymałem następujące odpowiedzi:

not ignoring mouse events
canBecomeKeyWindow
not isKeyWindow

Czy to jest problem? „nie isKeyWindow”? Przypuszczalnie nie jest to dobre, ponieważ dokumenty Apple'a mówią: „Jeśli użytkownik kliknie widok, który nie znajduje się w oknie klucza, domyślnie okno zostanie przeniesione i wykonane kluczem, ale zdarzenie myszy nie zostanie wysłane”. Ale musi być sposób na wykrycie tych zdarzeń. W JAKI SPOSÓB?

Dodawanie:

[[self window] makeKeyWindow];

nie działa, mimo że canBecomeKeyWindow jest TAK.

questionAnswers(6)

yourAnswerToTheQuestion