Ловкий двойной щелчок в Cocoa OSX

NSResponder, похоже, не имеет события двойного щелчка мыши. Есть ли простой способ поймать двойной щелчок?

Ответы

Ответ 1

Методы mouseDown: и mouseUp: принимают объект NSEvent как аргумент с информацией о кликах, включая clickCount.

Ответ 2

Проблема с простым решением clickCount заключается в том, что двойной щелчок рассматривается просто как два клика. Я имею в виду, что вы все равно получаете один клик. И если вы хотите по-другому реагировать на этот единственный клик, вам нужно что-то поверх простого подсчета кликов. Вот что я получил (в Swift):

private var _doubleClickTimer: NSTimer?

// a way to ignore first click when listening for double click
override func mouseDown(theEvent: NSEvent) {
    if theEvent.clickCount > 1 {
        _doubleClickTimer!.invalidate()
        onDoubleClick(theEvent)
    } else if theEvent.clickCount == 1 { // can be 0 - if delay was big between down and up
        _doubleClickTimer = NSTimer.scheduledTimerWithTimeInterval(
            0.3, // NSEvent.doubleClickInterval() - too long
            target: self,
            selector: "onDoubleClickTimeout:",
            userInfo: theEvent,
            repeats: false
        )
    }
}


func onDoubleClickTimeout(timer: NSTimer) {
    onClick(timer.userInfo as! NSEvent)
}


func onClick(theEvent: NSEvent) {
    println("single")
}


func onDoubleClick(theEvent: NSEvent) {
    println("double")
}

Ответ 3

Обычно приложения смотрят на clickCount == 2 on - [mouseUp:], чтобы определить двойной щелчок.

Одно из исправлений заключается в том, чтобы отслеживать местоположение щелчка мыши по значку [mouseDown:] и видеть, что дельта на месте расположения мыши небольшая (5 или менее точек как для x, так и для y).

Ответ 4

NSEvent, сгенерированный для mouseDown: и mouseUp:, имеет свойство clickCount. Проверьте, если это два, чтобы определить, произошел ли двойной щелчок.

Пример реализации:

- (void)mouseDown:(NSEvent *)event {
    if (event.clickCount == 2) {
        NSLog(@"Double click!");
    }
}

Просто поместите это в свой подкласс NSResponder (например, NSView).

Ответ 5

Лично я проверяю двойной клик на функции mouseUp:

- (void)mouseUp:(NSEvent *)theEvent
{

    if ([theEvent clickCount] == 2)
    {

        CGPoint point = [theEvent locationInWindow];
        NSLog(@"Double click on: %f, %f", point.x, point.y);

     }

}