2011-08-19 14 views
5

Przeszukałem dokumentację Apple i jedyna funkcja, jaką mogłem znaleźć odnoszące się do podwójnego kliknięcia, zwróciła właśnie dopuszczalny czas między kliknięciami, aby uznać to za podwójne kliknięcie.Odbieranie zdarzenia dwukrotnego kliknięcia

Czy ktoś może pokazać mi przykład zdarzenia z podwójnym kliknięciem?

+0

iOS lub Mac OS X? – duskwuff

+1

@duskwuff OSX (zobacz tagi) – Sciguy77

+1

@duskwuff: Również iOS nie ma kliknięć. –

Odpowiedz

14

Zastąp metodę NSResponder-mouseUp: i sprawdź dostarczone wydarzenie clickCount. Jeśli clickCount == 2, to szukasz podwójnego kliknięcia. Jeśli to 1, to jedno kliknięcie. 0, następnie czekali wystarczająco długo między naciśnięciem myszy i podniesieniem myszy, że system uznał, że to nie kliknięcie, po prostu rozróżnij zdarzenia, a następnie od góry.

- (void)mouseUp:(NSEvent *)event 
{ 
    NSInteger clickCount = [event clickCount]; 
    if (2 == clickCount) [self handleDoubleClickEvent:event]; 
} 

Zakłada, że ​​obiekt obsługujący kliknięcie jest częścią łańcucha respondera. Jeśli nie, będziesz musiał odbierać zdarzenia w inny sposób, na przykład podklasy NSApplication lub NSWindow i przesłonić -sendEvent:, aby przechwycić odpowiednie zdarzenie, zanim zostanie ono przekazane dalej.

+5

Należy podkreślić, że "NSResponder" w tej odpowiedzi odnosi się do klasy w kakao (z której wywodzą się NSView, NSWindow i NSApplication), a nie od drugiego odbierającego, który nazwał się po niej. –

2

Należy również zauważyć, że niektóre NSControl mają setDoubleAction:, więc selektor zarejestrowany za pośrednictwem setDoubleAction: jest wysyłany do celu. Zobacz oficjalne dokumentacje

+0

Zdarzenie (obiekt NSEvent) nie jest przekazywane do celu; wiadomość o akcji jest wysyłana do celu, ale, jak zwykle dla komunikatu akcji, pojedynczy argument jest formantem (widok tabeli lub czymkolwiek innym) wysyłającym wiadomość. Jestem pewien, że nie miałeś na myśli obiektu NSEvent, ale chciałem się upewnić, że to jasne. –

+0

Tak właśnie miałem na myśli; Zmienię to. Dzięki. – Yuji

+0

W moim przypadku musiałem ustawić cel dla NSTableView podczas pracy na OS przed 10.10, ale 10.10 działało OK bez ustawiania celu (ja w moim przypadku) – ghr