在Cocoa OSX中双击

Mik*_*012 17 macos cocoa double-click nsresponder

NSResponder似乎没有鼠标双击事件.是否有一种简单的方法来捕获双击?

Chu*_*uck 29

mouseDown:mouseUp:方法采取NSEvent对象作为与关于点击,包括的信息的参数clickCount.


jay*_*rjo 8

简单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")
}
Run Code Online (Sandbox Code Playgroud)


小智 6

通常应用程序会查看clickCount == 2 on - [mouseUp:]以确定双击.

一个改进是跟踪鼠标点击位置 - [mouseDown:],并看到鼠标向上位置的增量很小(x和y都是5点或更小).


Art*_*are 6

NSEvents生成mouseDown:mouseUp:拥有一个名为的属性clickCount.检查是否是两个以确定是否发生了双击.

示例实施:

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

只需将其放在您的NSResponder(例如NSView)子类中.