2011-07-06 16 views
6

Tengo un NSView que cubre su vista de contenido de la ventana principal. Esta vista tiene un controlador de eventos de clic que lo elimina de la vista de contenido. Dentro de esta vista, tengo otra vista. Cuando arrastro el mouse en esta vista interna, los eventos del mouse se aplican no solo a la vista en el frente, sino también a las vistas detrás. Además, los cursores de las vistas atrás también se muestran. Este es el mismo problema que ocurre aquí: NSView overlay passes mouse events to underlying subviews? pero la respuesta no funcionará para mi proyecto porque no puedo abrir otra ventana.Eventos de mouse sangrando a través de NSView

Gracias.

+0

Por favor, publique el código de manejo de eventos para la vista más vista. –

Respuesta

12

Sin ver su código de manejo de eventos es difícil saber lo que está sucediendo, pero sospecho que podría estar llamando a la implementación super de los diversos métodos de manejo de eventos en sus implementaciones.

NSView es una subclase de NSResponder, por lo que, por defecto, los eventos sin control se pasan a la cadena de respuesta. La supervista de una vista es el siguiente objeto en la cadena de respuesta, por lo que si llama, por ejemplo, [super mouseDown:event] en su implementación de ‑mouseDown:, el evento se pasará a la supervista.

La solución es asegurarse de que no haga llame a la implementación de super en sus controladores de eventos.

Esto es incorrecto:

- (void)mouseDown:(NSEvent*)anEvent 
{ 
    //do something 
    [super mouseDown:event]; 
} 

Esto es correcto:

- (void)mouseDown:(NSEvent*)anEvent 
{ 
    //do something 
} 
+1

Este es mi problema, excepto que necesitaba implementar métodos vacíos para el mouse arrastrado, la actualización del cursor y el mouse arriba, porque ya tenía una implementación para el mouse. ¿Qué evento, sin embargo, se encarga de cambiar el cursor? – Maz

+0

Simplemente use '-mouseEntered:' y '-mouseExited:' y establezca el cursor en esos métodos. –

+0

correcto. La portada de mi vista está funcionando bien ahora. –

2

respuesta de Rob y el comentario de Maz en esa respuesta resolver este problema, pero sólo para que sea absolutamente explícita. Con el fin de evitar que un NSView sangre los eventos del mouse al padre, uno debe implementar los métodos vacíos.

// NSResponder ========================================= 
- (void) mouseDown:(NSEvent*)event {} 
- (void) mouseDragged:(NSEvent*)event {} 
- (void) mouseUp:(NSEvent*)event {} 
Cuestiones relacionadas