MouseMoved не называется

У меня есть подкласский NSView, который является частью xix файла подкласса NSDocument, который оживает поведением по умолчанию метода NSDocumentController openDocument:. В этом подклассе NSView я реализовал методы awakeFromNib, в которых вызывается метод NSWindow setAcceptsMouseMovedEvents:YES, и acceptsFirstMouse:, который возвращает YES. Но моя реализация метода mouseMoved: моего подкласса NSView не вызывается, когда я наводил на нее указатель мыши. В чем может быть проблема?

Ответ 1

Я не использовал mouseMoved: в реальном проекте (я только немного поиграл с ним). Насколько я могу судить, mouseMoved: вызывается только тогда, когда ваше представление является первым ответчиком, а затем не только, когда мышь находится над вашим представлением, но всегда, когда движется мышь. Возможно, вам лучше использовать NSTrackingArea. Подробнее см. Cocoa Руководство по обработке событий.

Ответ 2

Обязательно запросите событие mouseMoved отправлено:

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

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

Ответ 3

Как отмечают другие, 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 =
            [.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)")
    }
}

Ответ 4

Просто запустите кого-нибудь в этом. Я столкнулся с проблемой, когда я подклассифицировал подкласс и пытался добавить зону отслеживания в оба класса (по двум причинам).

Если вы делаете что-то вроде этого, вам нужно убедиться, что ваш вызов mouseMoved: и т.д. в супер или только один из ваших подклассов получит сообщение.

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