2011-09-25 11 views
10

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

+0

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. –

Odpowiedz

10

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.

+0

To naprawdę nie odpowiada na pytanie. – uchuugaka

+0

Zobacz poniżej. Aby rozpocząć odbieranie tych zdarzeń, musisz mieć zainstalowany obszar śledzenia. – uchuugaka

19

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]; 
+0

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

+0

to jest właściwie odpowiedź –

1

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]; 
} 
2

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)") 
    } 
} 
Powiązane problemy