Mam podklasy NSView
, która jest częścią pliku .xib z podklasy NSDocument
, która staje się żywa przez domyślne zachowanie NSDocumentController
's metody openDocument:
. W tym podklasie NSView
zaimplementowałem metody awakeFromNib
, w których wywoływany jest sposób widoku i acceptsFirstMouse:
, który zwraca YES
. Ale moja metoda mouseMoved:
metoda mojej subklasysed NSView
nie zostanie wywołana, gdy przesuniemy nad nią mysz. Co może być problemem?mouseMoved nie nazywane
Odpowiedz
Nie użyłem mouseMoved:
w prawdziwym projekcie (właśnie grałem z nim trochę). O ile mogę powiedzieć, mouseMoved:
jest wywoływane tylko wtedy, gdy widok jest pierwszym respondentem, a następnie nie tylko, gdy mysz jest nad twoim widokiem, ale zawsze, gdy mysz się porusza. Lepiej możesz skorzystać z NSTrackingArea. Sprawdź numer Cocoa Event Handling Guide, aby uzyskać więcej informacji.
Należy zwrócić zdarzenie mouseMoved jest wysyłany:
NSTrackingAreaOptions options = (NSTrackingActiveAlways | NSTrackingInVisibleRect |
NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved);
NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self bounds]
options:options
owner:self
userInfo:nil];
Jedna uwaga. Nie jestem pewien, czy powinien to być int, ale raczej typ NSInteger lub typedef korzystnie NSTrackingAreaOptions, który jest nieskończenie bardziej czytelny i gwarantowany jako właściwy. – uchuugaka
to jest właściwie odpowiedź –
nie rozczarować ktoś prowadzi do tego. Wpadłem na problem, w którym podklasowałem podklasę i próbowałem dodać obszar śledzenia do obu klas (z dwóch różnych powodów).
Jeśli robisz coś takiego, musisz upewnić się, że twoje mouseMoved:
itd. Zadzwoni do super, lub tylko jedna z twoich podklas otrzyma wiadomość.
- (void) mouseMoved: (NSEvent*) theEvent
{
// Call the super event
[super mouseMoved: theEvent];
}
Jak wspomniano przez innych, NSTrackingArea
jest dobrym rozwiązaniem, a odpowiednie miejsce do zainstalowania obszar śledzenia jest NSView.updateTrackingAreas()
. Nie jest konieczne ustawianie właściwości zawierającej NSWindow o wartości setAcceptsMouseMovedEvents
.
w 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. GcmListenerService.onMessageReceived() nie nazywane
- 2. willSendRequestForAuthenticationChallenge nie nazywane
- 3. fbDidLogin nie nazywane
- 4. CLLocation didupdatetolocation nie nazywane
- 5. SKPaymentQueue updatedTransakcje nie nazywane
- 6. MotionEvent.ACTION_UP nie nazywane
- 7. shouldStartLoadWithRequest nigdy nie jest nazywane
- 8. outlineView: objectValueForTableColumn: byItem: nie nazywane
- 9. Youtube Iframe: onYouTubePlayerAPIReady() nie nazywane
- 10. EF 4.1 OnModelCreating nie nazywane
- 11. IMetadataAware.OnMetadataCreated nigdy nie jest nazywane
- 12. Ustawienia regionalne: onConfigurationChanged nie nazywane
- 13. iOS: CLLocationManager's didEnterRegion nie nazywane
- 14. Android onConfigurationChanged nie jest nazywane
- 15. Podklasa UIView: drawRect nie nazywane
- 16. Metody adaptera RecyclerView nie nazywane
- 17. Android ListView's setOnItemClickListener z PopupWindow nie nazywane
- 18. KMP skrypty package.json nie są nazywane
- 19. Android API21: VoiceInteractionService onReady() nie nazywane
- 20. Metody delegatów SKProductsRequest nigdy nie są nazywane
- 21. Intellij IDEA plugin - PersistentStateComponent loadState nie nazywane
- 22. @PostPersist nie nazywane ... @PrePersist to ... dlaczego?
- 23. onRegistered() od GCMIntentService nigdy nie nazywane
- 24. LocationClient requestUpdates onLocationChanged nigdy nie było nazywane
- 25. Niestandardowe pola modelu Django: to_python() nie nazywane
- 26. wyraźny konstruktor niewłaściwego typu nazywane
- 27. Co jest nazywane składnicą sesji?
- 28. Dlaczego ciasteczka są nazywane "ciasteczkami"?
- 29. Problemy z UINavigationController wewnątrz UITabBarController, viewWillAppear nie nazywane
- 30. Powiadomienie o możliwościach dostępu Nigdy nie było nazywane
W zależności od przypadku zastosowania, może być w stanie wykorzystać MouseDragged. Działa to bez NSTrackingArea, ale strzela tylko, gdy mysz jest wyłączona. –