Ho un NSMenu che si apre da un NSStatusItem utilizzando popUpStatusItemMenu. Questi NSMenuItem mostrano un sacco di link diversi, e ognuno è connesso con setAction: al metodo openLink: un target. Questa soluzione ha funzionato bene per molto tempo. L'utente sceglie un collegamento dal menu e il metodo openLink: il metodo quindi lo gestisce.NSView personalizzato in NSMenuItem non riceve eventi del mouse
Purtroppo, di recente ho deciso di provare a utilizzare il metodo setView: di NSMenuItem per fornire un'interfaccia più gradevole. Fondamentalmente, ho appena smesso di impostare il titolo, ho creato NSMenuItem e poi ho usato setView: per visualizzare una vista personalizzata. Funziona perfettamente, le voci del menu sembrano grandi e viene visualizzata la mia visualizzazione personalizzata.
Tuttavia, quando l'utente sceglie una voce di menu e rilascia il mouse, l'azione non funziona più (vale a dire, openLink: non viene chiamato). Se mi limito a commentare setView: call, quindi le azioni funzionano di nuovo (ovviamente, le voci del menu sono vuote, ma l'azione viene eseguita correttamente). La mia prima domanda, quindi, è perché l'impostazione di una vista interrompe l'azione di NSMenuItem.
Nessun problema, ho pensato, lo aggiusterò rilevando l'evento mouseUp nella mia vista personalizzata e invocando il mio metodo di azione da lì. Ho aggiunto questo metodo alla mia visualizzazione personalizzata:
- (void)mouseUp:(NSEvent *)theEvent {
NSLog(@"in mouseUp");
}
Nessun dado! Questo metodo non viene mai chiamato.
Posso impostare il rilevamento e ricevere mouseEntered: eventi, però. Ho messo alcuni test nella mia routine mouseEntered, come segue:
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"); }
E preso le seguenti risposte:
not ignoring mouse events
canBecomeKeyWindow
not isKeyWindow
E 'questo il problema? "non isKeyWindow"? Presumibilmente questo non va bene perché i documenti di Apple dicono "Se l'utente fa clic su una vista che non è nella finestra della chiave, per impostazione predefinita la finestra viene portata in avanti e resa la chiave, ma l'evento del mouse non viene inviato." Ma ci deve essere un modo per rilevare questi eventi. COME?
Aggiunta:
[[self window] makeKeyWindow];
ha alcun effetto, nonostante il fatto che canBecomeKeyWindow è SI.
Ci sono più informazioni su questo problema al radar aperta: http://openradar.appspot.com/7128269 C'è anche una soluzione rivendicata, ma non riesco a far funzionare il soluzione. Fondamentalmente la finestra si rifiuta di diventare la chiave, anche se segnala canBecomeKey. – Dennis
Ciao, ho affrontato lo stesso problema, hai qualche progresso con esso? Ho provato alcuni modi per risolverlo, ho trovato una soluzione alternativa ma è terribilmente brutta, e dopo aver mostrato la voce della barra di stato del menu non è evidenziata, ma il menu è mostrato e perfettamente funzionante. Ho impostato il menu per la voce di stato su zero e manualmente il menu popup di controllo. Se l'applicazione è attiva, chiamo semplicemente il metodo di menu popup, se no invio il messaggio di attivazione dell'applicazione, e nel menu di richiamata sto aprendo. Ecco un codice. Di nuovo è terribile e brutto. http://gist.github.com/224275 – iafonov
Devo dire che il codice di iafonov è FANTASTICO! Anche se un anno prima !!! Anche se il codice sembra irrilevante. Grazie! Risolve tutti i problemi relativi a NSVIew, NSTextEdit in NSMenuItem. All'inizio, NSTextEdit (in NSMenuItem) non funziona normalmente, non può ricevere la pressione di un tasto e il mouse non cambia, Ora tutto funziona alla grande !!! No accetta FirstResponder, No self window makeFirstResponder: xxx, solo codice iafonov. È il modo di far apparire il menu che conta. http://gist.github.com/224275 – user377808