Xcode mouseMoved未调用

Xcode mouseMoved未调用,xcode,cocoa,nsview,osx-lion,nswindow,Xcode,Cocoa,Nsview,Osx Lion,Nswindow,我有一个子类NSView,它是子类NSDocument的.xib文件的一部分,通过NSDocumentController的openDocument:方法的默认行为,它变得活跃起来。在这个子类NSView中,我实现了方法awakeFromNib,其中调用视图的NSWindowsetAcceptsMouseMovedEvents:YES方法,并调用acceptsFirstMouse:,返回YES。但是我的mouseMoved:子类NSView的方法实现在我将鼠标移到上面时不会被调用。有什么问题吗?

我有一个子类
NSView
,它是子类
NSDocument
的.xib文件的一部分,通过
NSDocumentController
openDocument:
方法的默认行为,它变得活跃起来。在这个子类
NSView
中,我实现了方法
awakeFromNib
,其中调用视图的
NSWindow
setAcceptsMouseMovedEvents:YES
方法,并调用
acceptsFirstMouse:
,返回
YES
。但是我的
mouseMoved:
子类
NSView
的方法实现在我将鼠标移到上面时不会被调用。有什么问题吗?

我没有在实际项目中使用
mouseMoved:
(我只是稍微玩弄了一下)。据我所知,
mouseMoved:
仅在视图是第一响应者时调用,并且不仅在鼠标位于视图上方时调用,而且总是在鼠标移动时调用。您最好使用NSTrackingArea。查看以获取更多信息。

确保请求发送mouseMoved事件:

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

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

以防万一有人碰到这件事。我遇到了一个问题,我正在对一个子类进行子类化,并试图为这两个类添加一个跟踪区域(出于两个不同的原因)

如果您正在执行类似操作,则需要确保您的
mouseMoved:
等调用进入super,否则只有一个子类会收到消息

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

正如其他人所指出的,
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)")
    }
}

@jbouwman答案的非屏蔽版本:

override func updateTrackingAreas() {
    self.addTrackingArea(NSTrackingArea(rect: self.bounds, options: [.mouseEnteredAndExited, .mouseMoved, .activeInKeyWindow], owner: self, userInfo: nil))
}
oc版本:

    - (void)updateTrackingAreas {
        [self initTrackingArea];
    }
    
    -(void) initTrackingArea {
        NSTrackingAreaOptions options = (NSTrackingActiveAlways | NSTrackingInVisibleRect |
                                 NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved);
    
        NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self bounds]
                                                            options:options
                                                              owner:self
                                                           userInfo:nil];
        
        [self addTrackingArea:area];
    }

这并不能真正回答问题。请参见下文。您需要安装一个跟踪区域,以便开始接收这些事件。我不确定它是否应该是int,而是NSInteger类型,或者typedef最好是NSTrackingAreaOptions,它的可读性更高,并且保证是正确的类型。这是正确的,但没有给出任何上下文来说明应该在哪里调用它。有关该信息,请参阅。根据您的用例,您可能可以使用MouseDragged。这可以在没有NSTrackingArea的情况下工作,但它仅在鼠标按下时触发。.mouseenteredexited、.mouseMoved、.activeInKeyWindow=>.mouseenteredexited、.mouseMoved、.activeInKeyWindow此示例代码按天保存。直到更新跟踪区域。谢谢但是但是哭泣