2009-09-08 9 views
7

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.

+0

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

+0

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

+0

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

risposta

9

aggiungere questo alla tua vista personalizzata e si dovrebbe andare bene:

- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent 
{ 
    return YES; 
} 
+1

Ha funzionato, grazie! – Vojto

4

ho aggiunto questo metodo per la mia vista personalizzata, e ora tutto funziona a meraviglia:

- (void)viewDidMoveToWindow { 
    [[self window] becomeKeyWindow]; 
} 

Spero che questo aiuti!

12

Aggiungi questo metodo per la vostra abitudine NSView e funzionerà bene con gli eventi del mouse

- (void)mouseUp:(NSEvent*) event { 
    NSMenuItem* mitem = [self enclosingMenuItem]; 
    NSMenu* m = [mitem menu]; 
    [m cancelTracking]; 
    [m performActionForItemAtIndex: [m indexOfItem: mitem]]; 
} 

ma sto avendo problemi con keyhandling, se avete risolto questo problema forse si può andare alla mia domanda e mi aiuta un po.

+0

Questa era la soluzione per me! Grazie! – kdbdallas

+0

Wow, ho passato mezza giornata a cercare di capirlo. Grazie – Cory

-1

Recentemente avevo bisogno di mostrare una vista personalizzata per un NSStatusItem, mostrare un normale NSMenu quando si fa clic su di esso e supportare le operazioni di trascinamento della selezione sull'icona Stato.

Ho risolto il mio problema utilizzando principalmente tre fonti diverse che possono essere trovate nella domanda this.

Spero che aiuti gli altri.

-1

Vedere il codice di esempio da Apple denominato CustomMenus In questo esempio si trova un buon esempio nella classe ImagePickerMenuItemView.

Non è semplice o banale fare in modo che una vista in un menu funzioni come un normale NSMenuItem. Ci sono delle decisioni e dei codici reali da fare.

Problemi correlati