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.
70
tab
nicht auf dem Feld bin , führt es auch die Aktion aus.Sie müssen nur das tun
Für einige Tasten (Eingabe, Löschen, Rücktaste usw.)
und implementieren Sie dann diese Methode
- (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector { NSLog(@"Selector method is (%@)", NSStringFromSelector( commandSelector ) ); if (commandSelector == @selector(insertNewline:)) { //Do something against ENTER key } else if (commandSelector == @selector(deleteForward:)) { //Do something against DELETE key } else if (commandSelector == @selector(deleteBackward:)) { //Do something against BACKSPACE key } else if (commandSelector == @selector(insertTab:)) { //Do something against TAB key } else if (commandSelector == @selector(cancelOperation:)) { //Do something against Escape key } // return YES if the action was handled; otherwise NO }
quelle
cancelOperation:
durch die Escape-Taste ausgelöst.Fügen Sie in Ihrem Delegaten (NSTextFieldDelegate) Folgendes hinzu:
-(void)controlTextDidEndEditing:(NSNotification *)notification { // See if it was due to a return if ( [[[notification userInfo] objectForKey:@"NSTextMovement"] intValue] == NSReturnTextMovement ) { NSLog(@"Return was pressed!"); } }
quelle
Die Swift 3- Version der Lösung von @ M.ShuaibImran:
Unterteilen Sie Ihren ViewController zunächst in: NSTextFieldDelegate
class MainViewController: NSViewController, NSTextFieldDelegate { ... }
Weisen Sie den textField-Delegaten dem ViewController in Ihrem viewDidLoad () zu:
Fügen Sie die NSTextFieldDelegate-Methode hinzu, die Tastatur-Responder verarbeitet:
func control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool { if (commandSelector == #selector(NSResponder.insertNewline(_:))) { // Do something against ENTER key print("enter") return true } else if (commandSelector == #selector(NSResponder.deleteForward(_:))) { // Do something against DELETE key return true } else if (commandSelector == #selector(NSResponder.deleteBackward(_:))) { // Do something against BACKSPACE key return true } else if (commandSelector == #selector(NSResponder.insertTab(_:))) { // Do something against TAB key return true } else if (commandSelector == #selector(NSResponder.cancelOperation(_:))) { // Do something against ESCAPE key return true } // return true if the action was handled; otherwise false return false }
quelle
Es ist sehr einfach und Sie können es direkt aus dem UI-Editor tun
Hinweis: Das Ereignis wird ausgelöst, sobald Sie die Taste
Tab
oderEnter
drücken. Wenn Sie möchten, dass die Aktion nur ausgelöst wird, wenn der Benutzer dieEnter
Taste drückt , müssen Sie eine Einstellung vornehmen. Gehen Sie zuAttribute inspector
und ändern Sie die Aktionseigenschaft inSend on Enter only
wie in der Abbildung unten gezeigtquelle
let resultLength = String(result).count
(Wenn das zu zählende Element bereits vorhanden ist,String
müssen Sie es natürlich nicht konvertierenString
, 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.NSTextFieldDelegate
's -control:textView:doCommandBySelector:
ist dein Freund.Suchen Sie nach dem
insertNewline:
Befehl.quelle
setAction:
oben benutzt), habe ich viele nützliche Dinge gefunden, wo esinsertNewline:
ist.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!
quelle
Der beste Weg, dies zu tun, besteht darin, den
NSTextField
Wert mit derNSString
Eigenschaft zu binden .Definieren Sie beispielsweise eine Methode:
(void)setTextFieldString:(NSString *)addressString {}
Bindungen hinzufügen:
[textField bind:@"value" toObject:self withKeyPath:@"self.textFieldString" options:nil];
Geben Sie einen beliebigen Text ein und drücken Sie die Eingabetaste
setTextFieldString
.quelle