2011-09-25 136 views
10

我有一個子類NSView它是一個子類NSDocument的.xib文件的一部分,它通過NSDocumentControlleropenDocument:方法的默認行爲得到活動。在這個小類NSView我已經實現了方法awakeFromNib,其中視圖的NSWindowsetAcceptsMouseMovedEvents:YES方法被調用,和acceptsFirstMouse:,它返回YES。但我的mouseMoved:方法實現我的子類NSView不會被調用,當我將鼠標移到它上面。可能是什麼問題?mouseMoved not called

+0

根據你的使用情況,您可以使用的mouseDragged。沒有NSTrackingArea的情況下,它只能在鼠標關閉時觸發。 –

回答

10

我還沒有在一個真正的項目中使用mouseMoved:(我剛剛玩了一下)。據我所知,mouseMoved:只在您的視圖是第一響應者時才被調用,然後不僅當鼠標位於視圖上時,而且總是在鼠標移動時。使用NSTrackingArea可能會更好。檢查Cocoa Event Handling Guide獲取更多信息。

+0

這並沒有真正回答這個問題。 – uchuugaka

+0

見下文。您需要安裝一個跟蹤區域才能開始接收這些事件。 – uchuugaka

19

一定要要求的mouseMoved事件發送:

NSTrackingAreaOptions options = (NSTrackingActiveAlways | NSTrackingInVisibleRect | 
         NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved); 

NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self bounds] 
                options:options 
                 owner:self 
                userInfo:nil]; 
+0

一個音符。我不確定它應該是一個int,而是一個NSInteger類型或typedef,最好是NSTrackingAreaOptions,它的可讀性更高,保證是正確的類型。 – uchuugaka

+0

這實際上是正確的答案 –

1

只是櫃面任何人運行到這一點。我遇到了一個問題,我繼承了一個子類,並試圖向兩個類添加跟蹤區域(出於兩個不同的原因)。

如果你正在做這樣的事情,你需要確保你的mouseMoved:等調用超級,或者只有一個你的子類會收到消息。

- (void) mouseMoved: (NSEvent*) theEvent 
{ 
    // Call the super event 
    [super mouseMoved: theEvent]; 
} 
2

正如其他人所指出的,NSTrackingArea是一個很好的解決方案,並安裝跟蹤區域是NSView.updateTrackingAreas()一個合適的位置。沒有必要設置包含NSWindow的setAcceptsMouseMovedEvents屬性。

在斯威夫特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)") 
    } 
}