Tengo una subclase NSView
que es parte de un archivo .xib de una subclase NSDocument
, que se activa por el comportamiento predeterminado del método NSDocumentController
openDocument:
. En esta subclase NSView
he implementado los métodos awakeFromNib
, en los que se llama al método de la vista NSWindow
setAcceptsMouseMovedEvents:YES
, y acceptsFirstMouse:
, que devuelve YES
. Pero mi implementación de método mouseMoved:
de mi subclase NSView
no se llama cuando muevo el mouse sobre ella. ¿Cuál podría ser el problema?mouseMoved no se llama
Respuesta
No he usado mouseMoved:
en un proyecto real (he jugado un poco con él un poco). Hasta donde puedo decir, solo se llama al mouseMoved:
cuando su vista es la primera que responde y luego no solo mientras el mouse está sobre su vista, sino siempre cuando se mueve el mouse. Tal vez sea mejor usar un NSTrackingArea. Consulte Cocoa Event Handling Guide para obtener más información.
Asegúrese de solicitar el evento se envía mouseMoved:
NSTrackingAreaOptions options = (NSTrackingActiveAlways | NSTrackingInVisibleRect |
NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved);
NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self bounds]
options:options
owner:self
userInfo:nil];
Una nota. No estoy seguro de que deba ser un int, sino más bien un tipo NSInteger o typedef, preferiblemente NSTrackingAreaOptions, que es infinitamente más legible y está garantizado que es el tipo correcto. – uchuugaka
esta es la respuesta correcta en realidad –
Sólo en caso cualquier otra persona se encuentra con esto. Me encontré con un problema donde estaba subclases una subclase y estaba tratando de agregar un área de seguimiento a ambas clases (por dos razones diferentes).
Si está haciendo algo como esto, deberá asegurarse de que su mouseMoved:
, etc. llame al súper, o solo una de sus subclases recibirá el mensaje.
- (void) mouseMoved: (NSEvent*) theEvent
{
// Call the super event
[super mouseMoved: theEvent];
}
Como han dicho otros, un NSTrackingArea
es una buena solución, y un lugar apropiado para instalar el área de seguimiento es NSView.updateTrackingAreas()
. No es necesario establecer la propiedad setAcceptsMouseMovedEvents
que contiene NSWindow.
En Swift 3:
class CustomView : NSView {
var trackingArea : NSTrackingArea?
override func updateTrackingAreas() {
if trackingArea != nil {
self.removeTrackingArea(trackingArea!)
}
let options : NSTrackingAreaOptions =
[.activeWhenFirstResponder, .mouseMoved ]
trackingArea = NSTrackingArea(rect: self.bounds, options: options,
owner: self, userInfo: nil)
self.addTrackingArea(trackingArea!)
}
override func mouseMoved(with event: NSEvent) {
Swift.print("Mouse moved: \(event)")
}
}
- 1. onPostExecute no se llama
- 2. onPageScrolled() no se llama
- 3. textFieldShouldReturn no se llama
- 4. fbDidLogin no se llama
- 5. WebMethod no se llama
- 6. didReceiveRemoteNotification no se llama
- 7. View.onMeasure() no se llama
- 8. onServiceConnected() no se llama
- 9. forwardInvocation no se llama?
- 10. accesorioButtonTappedForRowWithIndexPath: no se llama.
- 11. didReceiveAuthenticationChallenge no se llama
- 12. ViewForAnnotation no se llama
- 13. UITableView cellforrowatindexpath no se llama
- 14. MKAnnotationView drawRect: no se llama
- 15. MPMoviePlayerPlaybackDidFinishNotification se llama cuando no
- 16. onDraw personalizada() no se llama
- 17. EKEventViewDelegate didCompleteWithAction no se llama
- 18. NuGet - install.ps1 no se llama
- 19. Android onConfigurationChanged no se llama
- 20. Reductor Hadoop no se llama
- 21. Tomcat ServletContextListener.contextDestroyed no se llama
- 22. dylib destructor no se llama
- 23. Intento implícito no se llama
- 24. UIViewController -viewDidLoad no se llama
- 25. Ruta troncal no se llama
- 26. localStorage eventListener no se llama
- 27. La función no se llama
- 28. initwithstyle: reuseIdentifier: no se llama
- 29. Drupal hook_views_post_execute no se llama
- 30. java keylistener no se llama
Dependiendo de su caso de uso, es posible que pueda utilizar mouseDragged. Eso funciona sin un NSTrackingArea, pero solo se activa si el mouse está inactivo. –