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)
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:
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.:
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?
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.
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%