Ho una sottoclasse NSView
che fa parte di un file .xib di una sottoclasse NSDocument
, che diventa attiva con il comportamento predefinito del metodo . In questa sottoclasse NSView
ho implementato i metodi awakeFromNib
, in cui viene chiamato il metodo NSWindow
setAcceptsMouseMovedEvents:YES
della vista e acceptsFirstMouse:
, che restituisce YES
. Ma l'implementazione del metodo mouseMoved:
della sottoclasse NSView
non viene chiamata quando si sposta il mouse su di essa. Quale potrebbe essere il problema?mouseMoved non chiamato
risposta
Non ho usato mouseMoved:
in un progetto reale (ci ho giocato un po '). Per quanto posso dire, mouseMoved:
viene chiamato solo quando la tua vista è la prima a rispondere e quindi non solo mentre il mouse è sopra la tua vista, ma sempre quando il mouse si muove. Potrebbe essere meglio usare NSTrackingArea. Controllare lo Cocoa Event Handling Guide per ulteriori informazioni.
Assicuratevi di richiedere l'evento mouseMoved viene inviato:
NSTrackingAreaOptions options = (NSTrackingActiveAlways | NSTrackingInVisibleRect |
NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved);
NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self bounds]
options:options
owner:self
userInfo:nil];
Una nota. Non sono sicuro che dovrebbe essere un int ma piuttosto un tipo NSInteger o il typedef preferibilmente NSTrackingAreaOptions che è infinitamente più leggibile e garantito per essere il tipo giusto. – uchuugaka
questa è la risposta corretta in realtà –
Solo in caso chiunque altro si imbatte in questo. Mi sono imbattuto in un problema in cui stavo sottoclassi una sottoclasse e stavo cercando di aggiungere un'area di tracciamento ad entrambe le classi (per due diversi motivi).
Se si sta facendo qualcosa del genere, è necessario assicurarsi che il proprio mouseMoved:
, ecc. Chiami nel super o solo una delle sottoclassi riceverà il messaggio.
- (void) mouseMoved: (NSEvent*) theEvent
{
// Call the super event
[super mouseMoved: theEvent];
}
Come notato da altri, un NSTrackingArea
è una buona soluzione, e un luogo adatto per l'installazione nella zona di monitoraggio è NSView.updateTrackingAreas()
. Non è necessario impostare la proprietà setAcceptsMouseMovedEvents
contenente NSWindow.
In 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. Metodi MouseAdapter: perché sono inclusi mouseDragged, mouseMoved e mouseWheelMoved?
- 2. UITableView cellforrowatindexpath non chiamato
- 3. doFilter non sempre chiamato
- 4. textViewDidEndEditing non è chiamato
- 5. didReceiveRemoteNotification non chiamato
- 6. non onActivityResult essere chiamato
- 7. BackUpAgentHelperClass non viene chiamato
- 8. initWithNibName non viene chiamato
- 9. DropCreateDatabaseAlways Seed non chiamato
- 10. onServiceConnected() non chiamato
- 11. onPostExecute non viene chiamato
- 12. didSelectRowAtIndexPath: non viene chiamato
- 13. initwithstyle: riutilizzoIdentificatore: non chiamato
- 14. Android onBackStackChanged() non chiamato
- 15. Page_PreInit non chiamato?
- 16. IBAction non viene chiamato
- 17. didFinishNavigation non essere chiamato
- 18. didSelectAnnotationView non chiamato
- 19. CLLocation didupdatetolocation non chiamato
- 20. preferisceStatusBarHidden non chiamato
- 21. Frammento onResume non chiamato
- 22. apply_authorization_limits non è chiamato
- 23. glkView drawInRect non chiamato
- 24. TimePickerDialog.onTimeSetListener non chiamato
- 25. forwardInvocation non viene chiamato?
- 26. handleWatchKitExtensionRequest non viene chiamato
- 27. OnBackPressed non viene chiamato?
- 28. - [NSResponder swipeWithEvent:] non chiamato
- 29. willSendRequestForAuthenticationChallenge non chiamato
- 30. View.onMeasure() non chiamato
A seconda del caso d'uso, si può essere in grado di utilizzare mouseDragged. Funziona senza NSTrackingArea, ma si attiva solo se il mouse non funziona. –