mouseMoved未调用

Dom*_*old 15 xcode cocoa nsview nswindow osx-lion

我有一个子类NSView是一个子类的的.xib文件的组成部分NSDocument,它通过的默认行为得到活着NSDocumentControlleropenDocument:方法.在这个子类中,NSView我已经实现了方法awakeFromNib,其中NSWindow setAcceptsMouseMovedEvents:YES调用了view的方法,并且acceptsFirstMouse:返回了该方法YES.但是当我将鼠标移到它上面时mouseMoved:,我的子类的方法实现NSView不会被调用.可能是什么问题?

zee*_*ple 26

请务必请求发送mouseMoved事件:

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

NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self bounds]
                                                    options:options
                                                      owner:self
                                                   userInfo:nil];
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的,但没有给出应在何处调用的上下文。有关该信息,请参见/sf/answers/2931475921/。 (3认同)

小智 11

我没有mouseMoved:在一个真实的项目中使用过(我刚刚玩了一下).据我所知,mouseMoved:只有在您的视图是第一响应者时才会调用,然后不仅在鼠标位于视图上方时调用,而且始终在鼠标移动时调用.你可能最好使用NSTrackingArea.有关详细信息,请查看" 可可事件处理指南".

  • 这并没有真正回答这个问题. (3认同)

jbo*_*man 11

正如其他人所指出的,NSTrackingArea一个很好的解决方案,安装跟踪区域的适当位置是NSView.updateTrackingAreas().没有必要设置包含NSWindow的setAcceptsMouseMovedEvents属性.

在Swift 3中:

class CustomView : NSView {

    var trackingArea : NSTrackingArea?

    override func updateTrackingAreas() {
        if trackingArea != nil {
            self.removeTrackingArea(trackingArea!)
        }
        let options : NSTrackingAreaOptions =
            [.mouseEnteredAndExited, .mouseMoved, .activeInKeyWindow]
        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)")
    }
}
Run Code Online (Sandbox Code Playgroud)