2012-08-19 21 views
5

Ho un problema con l'ascolto di eventi, posso ascoltare eventi che funzionano perfettamente, ma non riesco a smettere di ascoltare gli eventi. L'ho ricercato per un po 'e ho trovato il metodo a + (void) removeMonitor: (id) eventMonitor, che dice che dovrei usare quando ho finito con l'ascoltatoreCome smettere di ascoltare NSEvents?

Ma quando provo ad usare il metodo, in questo modo

[NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseDownMask|NSKeyDownMask) handler:^(NSEvent *event) { 
    [NSEvent removeMonitor:event]; 
}]; 

continuo a ricevere un errore di "- [NSEvent invalidare]: selettore non riconosciuto inviato ad esempio", che ho studiato così, e credo che vuol dire che sto sovrascrivendo una memoria che è in uso. Tuttavia non so come risolvere questo problema. Qualsiasi suggerimento o aiuto è molto apprezzato!

UPDATE Grazie a JWWalker, Samir e Abizern, ora funziona

//I made a global variable called eventHAndler 

file h

id eventHAndler 

di file .m

eventHAndler = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseDownMask|NSKeyDownMask) handler:^(NSEvent *event){ 
///code 
}]; 

/// created another method called stop. When called it stops the eventHAndler 
- (IBAction)Stop:(id)sender 
{ 
    stop = 1; 
    NSLog(@"inside stop method"); 
    [NSEvent removeMonitor:eventHAndler]; 
} 

risposta

11

si sta passando la cosa sbagliata da removeMonitor:. La chiamata a +[NSEvent addGlobalMonitorForEventsMatchingMask: handler:] restituisce un valore denominato oggetto gestore eventi. Questo è ciò che può essere passato a removeMonitor:.

+0

Mi dispiace, sono ancora un po 'confuso. Come ottengo il valore restituito per + [NSEvent addGlobalMonitorForEventsMatchingMask: handler:^(NSEvent * event)]? –

+0

@ A.sharif, se intendi come lo fai nel blocco che gestisce l'evento, quindi francamente non lo so, non ho mai usato i blocchi. – JWWalker

+1

JWWalker ha ragione. Qualcosa come: id eventHAndler = [NSEvent addGlobalMonitorForEventsMatchingMask: handler:]; .... [NSEvent removeHandler: eventHAndler] Assicurarsi di rimuovere il gestore solo una volta, altrimenti si potrebbero verificare problemi di memoria. – Samir

0

Secondo: http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/EventOverview/MonitoringEvents/MonitoringEvents.html

T hey dire:

Un monitor evento globale cerca eventi user-ingresso spediti verso applicazioni diverse da quella in cui è installato. Il monitor non può modificare un evento o impedirne la normale consegna. E può solo gli eventi chiave del monitor se l'accessibilità è abilitata o se l'applicazione è attendibile per l'accessibilità.

Quindi non è possibile, dice l'uomo stesso: P

+0

Non sto cercando di fermare l'azione. Sto cercando di smettere di ascoltarlo. Essenzialmente il mio problema è che il mio programma entra in un ciclo che ascolta solo. Voglio lasciare quel ciclo. Il commento che hai citato sta parlando di alterare ciò che l'utente inserisce, che non è quello che sto cercando di fare. –

+0

Se stai solo cercando di smettere di ascoltarlo perché non usare solo una semplice BOOL o qualcosa di simile e controlla se è sì o no, e fai ciò che è appropriato. –

+0

Non riesco a uscire dal ciclo con un'istruzione return o break, quindi un'istruzione booleana non mi aiuterebbe a meno che non sapessi come uscire dal ciclo. –