NSButton mouseDown mouseUp verhält sich bei Aktivierung unterschiedlich

8

Wenn der NSButton nicht aktiviert ist, verhalten sich mouseDown: und mouseUp wie erwartet (wenn also die Maus gedrückt wird, wird mouseDown: aufgerufen, und wenn sie freigegeben wird, wird mouseUp: aufgerufen)

Wenn jedoch der NSButton aktiviert ist, wird mouseUp: überhaupt nicht aufgerufen, und mouseDown: wird aufgerufen, nachdem die Maus freigegeben wurde

%Vor%

Warum verhält sich das anders und wie kann ich das richtige Verhalten erzwingen (wie wenn die Schaltfläche NICHT aktiviert ist)

    
Peter Lapisu 13.03.2014, 20:04
quelle

4 Antworten

2

Um den vorherigen wegzubasteln, wenn der Wunsch besteht, eine benutzerdefinierte Schaltfläche zu erstellen, deren Aktionsmethode Unterdrückungen von Freigaben unterscheiden kann, versuchen Sie, die Eigenschaft isPressed und den folgenden Code hinzuzufügen:

%Vor%

Die benutzerdefinierte Schaltfläche muss so eingestellt sein, dass sie Aktionen per:

sendet %Vor%

Ohne dies wird die Aktionsmethode erst aufgerufen, wenn die Schaltfläche losgelassen wird.

In der Aktionsmethode kann isPressed abgefragt werden. z.B.:

%Vor%

Ein lästiges, aber harmloses "Feature" davon ist, dass die Aktionsmethode zweimal aufgerufen wird, wenn die Schaltfläche losgelassen wird: einmal von innerhalb NSButton mit isPressed immer noch wahr. (Dies sollte ignoriert werden.) Das zweite Mal von der performSelector -Methode der benutzerdefinierten Schaltfläche mit isPressed false.

Gibt es Kommentare darüber, ob dies in zukünftigen Releases wahrscheinlich funktioniert?

    
Allen King 13.02.2016, 15:19
quelle
13

wenn jemand immer noch danach sucht ... Ich weiß nicht warum, aber das funktioniert für mich ...

%Vor%     
Ammarz 30.11.2014 17:58
quelle
5

Das Verhalten ist korrekt. Ihre Erwartung, dass alle Mouse-up-Ereignisse Responder-Methoden durchlaufen, ist falsch.

Wenn die Schaltfläche aktiviert ist, wird die Superklassenimplementierung von -mouseDown: eine interne Ereignisverfolgungsschleife ausführen, um die Mausbewegung zu verfolgen und die Schaltfläche als gedrückt zu zeigen, solange sich die Maus darin befindet und sie als nicht gedrückt zeigt Die Maus fährt aus. Diese interne Ereignisschleife erhält das Ereignis NSLeftMouseUp . Es wird niemals an eine Responder-Methode gesendet.

Siehe Cocoa Event Handling Guide: Umgang mit Mausereignissen - Handhabung von Maus-Drag-Operationen - Der Mouse-Tracking-Loop-Ansatz .

    
Ken Thomases 13.03.2014 21:11
quelle
0

Bauen Sie die anderen auf, hier ist ein Swift, der parallel zur Objective-C-Mausverfolgungsschleife in Apples Dokumentation für eine Unterklasse von NSButton arbeitet. Unser Code speichert die Ereignisse, anstatt sie an die Superklasse und ihre Ereignisschleife zu übergeben.

%Vor%     
JKaz 06.05.2016 00:09
quelle