Eine Aktion ausführen, wenn die Eingabetaste in einem NSTextField gedrückt wird?

70

Ich habe gerade ein kleines Problem. Ich möchte eine Methode ausführen, wenn die Eingabetaste in einem NSTextField gedrückt wird. Der Benutzer sollte in der Lage sein, seine Daten einzugeben, und eine Berechnungsmethode sollte ausgeführt werden, sobald er die Eingabetaste drückt.

TalkingCode
quelle

Antworten:

82

Sie können dies tun, indem Sie die Aktion des Textfelds festlegen. Verbinden Sie in IB den Selektor des Textfelds mit Ihrem Controller oder einem beliebigen Objekt, das die IBAction darstellt, die Sie verwenden möchten.

Senden Sie dem NSTextField eine setTarget:Nachricht und eine setAction:Nachricht , um den Code festzulegen . Wenn Sie dies beispielsweise für Ihr Controller-Objekt im Code festlegen und Ihr textField-Ausgang myTextField heißt:

Jason Coco
quelle
1
Es ist wichtig zu beachten, dass dies in IB nicht funktioniert (zumindest konnte ich es nicht zum Laufen bringen).
StuFF mc
Das erste Mal, als ich dies mit Interface Builder versuchte, funktionierte es nicht. Warum auch immer. Das zweite hat funktioniert. Natürlich immer im Code arbeiten. Danke, dass du den Weg gezeigt hast!
StuFF Mc
6
Außer wenn ich tabnicht auf dem Feld bin , führt es auch die Aktion aus.
Citelao
82
citelao: Im modernen XCode kann das NSTextField verschiedene Aktionsmodi haben. Standardmäßig ist ein NSTextField auf "Senden am Ende der Bearbeitung" eingestellt, wodurch die Aktion gesendet wird, wenn Sie die Bearbeitung aus irgendeinem Grund beenden (z. B. durch Tippen). Sie können es jedoch im Interface Builder auf "Nur bei Eingabe senden" (auf der Registerkarte "Attribute" unten in der Attributgruppe "Textfeld") ändern, damit die Aktion nur gesendet wird, wenn der Benutzer tatsächlich die Eingabetaste drückt.
Trevor Powell
1
Leider wird der Selektor auch gesendet, wenn Sie auf das X rechts neben dem NSSearchField klicken. In den Apple-Dokumenten wird empfohlen, auf X zu klicken, um alles zu löschen und die Eingabetaste einzugeben. Daher wird der Selektor aufgerufen, damit Sie nach einem leeren NSSearchField suchen und Ergebnisse löschen können. Wenn Ihnen dieses Verhalten nicht gefällt, besteht die einzige Lösung darin, Code hinzuzufügen, der dem folgenden ähnelt: [[[searchField cell] cancelButtonCell] setAction: @selector (clearSearchField :)]; [[[searchField cell] cancelButtonCell] setTarget: self];
Winter Dragoness
50

Sie müssen nur das tun

Für einige Tasten (Eingabe, Löschen, Rücktaste usw.)

und implementieren Sie dann diese Methode

M. Shuaib Imran
quelle
3
Ein weiterer relevanter Befehl wird cancelOperation:durch die Escape-Taste ausgelöst.
Abhi Beckert
26

Fügen Sie in Ihrem Delegaten (NSTextFieldDelegate) Folgendes hinzu:

Raff
quelle
2
Dieser Code ist für Situationen gedacht, in denen das Textfeld seinen Fokus verliert. NICHT EINGABETASTE
Gargo
Vergessen Sie nicht, Ihren Delegaten in .h, in Code / IB festzulegen und die Textfeldaktion in IB auf "Nur bei Eingabe senden" zu ändern.
Nalply
2
@Gargo Dies gilt zumindest für El Capitan nicht. Durch Drücken der Eingabetaste wird diese Nachricht empfangen. Entweder ist es eine Validierung, die es verursacht, oder etwas anderes.
Marek H
24

Die Swift 3- Version der Lösung von @ M.ShuaibImran:

Unterteilen Sie Ihren ViewController zunächst in: NSTextFieldDelegate

Weisen Sie den textField-Delegaten dem ViewController in Ihrem viewDidLoad () zu:

Fügen Sie die NSTextFieldDelegate-Methode hinzu, die Tastatur-Responder verarbeitet:

drdrdrdr
quelle
Danke für diesen einen. Genau das, wonach ich gesucht habe und fast 3 Jahre später funktioniert es in Swift 5 / Xcode 11 immer noch ohne Änderungen oder Xcode-Empfehlungen.
Aeger
14

Es ist sehr einfach und Sie können es direkt aus dem UI-Editor tun

  1. Klicken Sie mit der rechten Maustaste auf das Textfeld und ziehen Sie die Aktionsreferenz auf die Schaltfläche, wie unten im Screenshot gezeigt

Geben Sie hier die Bildbeschreibung ein

  1. Jetzt erhalten Sie eine Option, wie in der Abbildung unten gezeigt. Sie müssen "Klick ausführen" auswählen

Geben Sie hier die Bildbeschreibung ein

  1. Jetzt sollte es so aussehen

Geben Sie hier die Bildbeschreibung ein

Hinweis: Das Ereignis wird ausgelöst, sobald Sie die Taste Taboder Enterdrücken. Wenn Sie möchten, dass die Aktion nur ausgelöst wird, wenn der Benutzer die EnterTaste drückt , müssen Sie eine Einstellung vornehmen. Gehen Sie zu Attribute inspectorund ändern Sie die Aktionseigenschaft in Send on Enter onlywie in der Abbildung unten gezeigt

Geben Sie hier die Bildbeschreibung ein

Vikas Bansal
quelle
1
Hallo, nachdem ich dies getan habe, wenn ich die Eingabetaste drücke, wird der gesamte Text im Textfeld ausgewählt. Wie kann ich das stoppen?
Souvickcse
@ Vikas Bansal danke, Bruder, deine Lösung hat bei mir funktioniert.
Bilal Basharat
@ Souvickcse Ich bin auf genau das gleiche Problem gestoßen. Haben Sie hier eine Lösung gefunden? Es ist 3,5 Jahre später, aber ...
begrüßen
Um ehrlich zu sein, habe ich das Problem selbst vergessen. Bitte versuchen Sie eine andere Lösung für diese Frage. Ich denke, Ihr
Willensproblem
Ja ... ein paar Tage später fand ich eine Lösung für den hervorgehobenen Text, nachdem die Aktion aufgerufen wurde: Setzen Sie einfach diese drei Zeilen zuletzt: let resultLength = String(result).count(Wenn das zu zählende Element bereits vorhanden ist, Stringmüssen Sie es natürlich nicht konvertieren String, und fügen Sie es hinzu diese Zeile: yourNSTextField.currentEditor()?.selectedRange = NSRange(location: resultLength, length: 0)und dann diese: yourNSTextField.displayIfNeeded()Der Cursor springt direkt hinter das letzte Zeichen Ihres präsentierten Inhalts.
Aeger
4

NSTextFieldDelegate's - control:textView:doCommandBySelector:ist dein Freund.

Suchen Sie nach dem insertNewline:Befehl.

iljawascoding
quelle
Danke dafür. Obwohl ich es nicht benutzt habe (ich habe das setAction:oben benutzt), habe ich viele nützliche Dinge gefunden, wo es insertNewline:ist.
StuFF mc
1

Klicken Sie im Interface Builder auf Ihr NSTextField, gehen Sie zum Verbindungseditor, ziehen Sie vom Selektor auf Ihr Controller-Objekt - Ihre Aktionen sollten ausgeführt werden!

Daniel Morris
quelle
1

Der beste Weg, dies zu tun, besteht darin, den NSTextFieldWert mit der NSStringEigenschaft zu binden .

Definieren Sie beispielsweise eine Methode:

Bindungen hinzufügen:

Geben Sie einen beliebigen Text ein und drücken Sie die Eingabetaste setTextFieldString.

Sathish Kumar
quelle