2012-08-19 7 views
5

Tengo un problema con la escucha de eventos, puedo escuchar eventos que funcionan perfectamente, pero no puedo dejar de escuchar eventos. Investigué por un tiempo y se me ocurrió el método a, + (void) removeMonitor: (id) eventMonitor, que dice que debo usar cuando termino con el oyente¿Cómo dejar de escuchar NSEvents?

Pero cuando intento usar el método, al igual que

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

sigo obteniendo un error de "- [NSEvent invalida]: selector no reconocido enviado a la instancia" ¿Qué he investigado también, y yo creo que significa que estoy sobrescribir una memoria que es siendo utilizado. Sin embargo, no sé cómo resolver este problema. ¡Cualquier sugerencia o ayuda es muy apreciada!

ACTUALIZACIÓN Gracias a JWWalker, Samir y Abizern, que ahora trabaja

//I made a global variable called eventHAndler 

archivo .h

id eventHAndler 

archivo .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]; 
} 

Respuesta

11

estás pasando lo peor que removeMonitor:. La llamada al +[NSEvent addGlobalMonitorForEventsMatchingMask: handler:] devuelve un valor llamado objeto de controlador de eventos. Eso es lo que se puede pasar al removeMonitor:.

+0

Lo siento, todavía estoy un poco confundido. ¿Cómo obtengo el valor devuelto para + [NSEvent addGlobalMonitorForEventsMatchingMask: handler:^(NSEvent * event)]? –

+0

@ A.sharif, si te refieres a cómo lo consigues en el bloque que maneja el evento, entonces, francamente, no sé, nunca he usado bloques. – JWWalker

+1

JWWalker tiene razón. Algo como: id eventHAndler = [NSEvent addGlobalMonitorForEventsMatchingMask: handler:]; .... [NSEvent removeHandler: eventHAndler] Asegúrese de quitar el controlador solo una vez, de lo contrario, puede experimentar problemas de memoria. – Samir

0

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

T hey say:

Un monitor evento global busca eventos de entrada del usuario enviados a aplicaciones distintas a aquella en la que se instala. El monitor no puede modificar un evento o impedir su entrega normal. Y solo puede monitorear eventos clave si la accesibilidad está habilitada o si la aplicación es de confianza para el acceso.

Por lo tanto, no es posible, dice el hombre mismo: P

+0

No estoy tratando de detener la acción. Estoy tratando de dejar de escucharlo. Esencialmente, mi problema es que mi programa entra en un ciclo que simplemente escucha. Quiero dejar ese bucle. El comentario que citó habla de alterar lo que el usuario ingresa, que no es lo que estoy tratando de hacer. –

+0

Si solo está tratando de dejar de escucharlo, ¿por qué no simplemente usa un BOOL simple o algo similar y verifica si es sí o no, y hacer lo que sea apropiado? –

+0

No puedo salir del ciclo con una declaración de retorno o de interrupción, por lo que una declaración booleana no me ayudaría a menos que supiera cómo salir del ciclo. –