2010-02-02 15 views

Antwort

25

Die Methoden mouseDown: und mouseUp: verwenden ein NSEvent-Objekt als Argument mit Informationen zu den Klicks, einschließlich clickCount.

4

Im Allgemeinen sehen Anwendungen clickCount == 2 on - [mouseUp:], um einen Doppelklick zu bestimmen.

Eine Verfeinerung besteht darin, die Position des Mausklicks auf dem - [mouseDown:] zu verfolgen und zu sehen, dass das Delta an der Maus hoch ist (5 Punkte oder weniger sowohl im x als auch im y).

+1

IMHO ist dies die sachdienliche Antwort, wie es auch die implizite Antworten Frage, ob auf zweites MouseDown oder zweites mouseUp reagiert werden soll. Natürlich kann es in bestimmten Situationen sinnvoll sein, vom Standard abzuweichen. Leider hält sich Apple nicht ganz an einen Standard (Finder und Mail on up, Kalender on down) ... – fzwo

4

Die für mouseDown: und mouseUp: generierten NSEvent s haben eine Eigenschaft namens clickCount. Überprüfen Sie, ob es zwei ist, um festzustellen, ob ein Doppelklick stattgefunden hat.

Beispielimplementierung:

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

Legen Sie einfach, dass in Ihrem NSResponder (wie ein NSView) Unterklasse.

+0

Und was würden Sie normalerweise tun, wenn Sie beides bewältigen müssen - Single-Click und Double-Click. Offensichtlich müssen Sie den Single-Click irgendwie ignorieren, wenn sich am Ende ein Doppelklick ergibt? – jayarjo

+0

@jayarjo - Von meinem Kopf aus kann ich mir keinen Ort vorstellen, an dem die Aktion mit einem einzigen Klick ausgeführt werden sollte, wenn sich herausstellt, dass ein Doppelklick notwendig war. In Textfeldern bringt ein einzelner Klick den Cursor an eine bestimmte Stelle. Durch Doppelklicken wird das gesamte Wort hervorgehoben. Das Bewegen des Cursors auf den einzelnen Klick war also harmlos. In RTS-Spielen (zumindest Blizzards) wählt ein einzelner Klick eine einzelne Einheit, während ein Doppelklick alle Einheiten dieses Typs auswählt. Wenn Sie möchten, dass der Doppelklick etwas völlig anderes macht, als ein einzelner Klick, sollten Sie Ihr gesamtes UX überdenken. – ArtOfWarfare

6

Das Problem mit der einfachen clickCount Lösung ist, dass Doppelklick einfach als zwei einzelne Klicks betrachtet wird. Ich meine, du bekommst immer noch den einzigen Klick. Und wenn Sie auf diesen einzelnen Klick anders reagieren möchten, brauchen Sie etwas zusätzlich zum bloßen Klick-Zählen. Hier ist, was ich mit (in Swift) endete:

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") 
} 
0

Ich persönlich überprüfen Sie den Doppelklick in mouseUp Funktionen:

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

    if ([theEvent clickCount] == 2) 
    { 

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

    } 

}