Wie kann ich mit der Eingabetaste dieselbe Aktion ausführen wie mit einem Tastendruck in Swift?

70

Ich möchte wissen, wie Sie eine Aktion zulassen, indem Sie entweder die Eingabetaste auf der Softwaretastatur drücken oder auf einen UIButton tippen.

Die UI-Schaltfläche ist bereits für die Durchführung einer IBAction eingerichtet.

Wie erlaube ich Benutzern auch, die Eingabetaste auf der Tastatur zu drücken, um dieselbe Aktion auszuführen?

Referenz 13
quelle

Antworten:

108

Stellen Sie sicher, dass Ihre Klasse das UITextFieldDelegate-Protokoll erweitert

SomeViewControllerClass : UIViewController, UITextFieldDelegate

Sie können folgende Aktionen ausführen:

override func viewDidLoad() {
    super.viewDidLoad()

    self.textField.delegate = self
}

func textFieldShouldReturn(textField: UITextField) -> Bool {

    //textField code

    textField.resignFirstResponder()  //if desired
    performAction()
    return true
}

func performAction() {   
    //action events
}
Steve Rosenberg
quelle
5
Diese Antwort ist richtig, aber Ihr View Controller muss das UITextViewDelegate-Protokoll übernehmen
lborgav
Eigentlich muss der View Controller das UITextFieldDelegate-Protokoll übernehmen, und es funktioniert einwandfrei
Sergio Ayestarán
Einverstanden, ich bin zu verbrannt von der Arbeit. Als ich "Protokoll übernehmen" sagte, meinte ich eigentlich, was @ csga5000 sagte, erbe das Protokoll UITextFieldDelegate wie in: Klasse myViewController: UIViewController, UITextFieldDelegate {}, danke für die Korrektur!
Sergio Ayestarán
85

AKTUALISIEREN

Wenn Ihr Bereitstellungsziel iOS 9.0 oder höher ist, können Sie das Ereignis "Primäre Aktion ausgelöst" Ihres Textfelds mit einer Aktion wie der folgenden verbinden:

Verbindungsereignis, das durch eine primäre Aktion ausgelöst wurde

ORIGINAL

Lassen Sie Ihren View Controller das UITextFieldDelegateProtokoll übernehmen.

Legen Sie den Delegaten Ihres Textfelds für Ihren Ansichts-Controller fest.

Implementieren Sie textFieldShouldReturn:, um Ihre Aktion aufzurufen.

Rob Mayoff
quelle
7

Swift 4.2:

Ein anderer Ansatz für das programmgesteuert erstellte Textfeld, für den keine Delegierung erforderlich ist:

     MyTextField.addTarget(self, action: #selector(MyTextFielAction)
                               , for: UIControl.Event.primaryActionTriggered)

Und dann führen Sie Ihre Aktion wie folgt aus:

    func MyTextFielAction(textField: UITextField) {
       //YOUR CODE can perform same action as your UIButton
    }
Josh
quelle
5

Wenn Ihr Bereitstellungsziel iOS 9.0 oder höher ist, können Sie das Ereignis "Primäre Aktion ausgelöst" Ihres Textfelds mit einer Aktion wie der folgenden verbinden:

Ich konnte die "Ausgelöste primäre Aktion" nicht wie vorgeschlagen zum Laufen bringen. Ich habe "Editing Did End" verwendet und das funktioniert jetzt. Screenshot von Editing Did End

Geben Sie hier die Bildbeschreibung ein

Jacob F. Davis C-CISO
quelle
1

Hier ist ein vollständiges Beispiel mit beiden:

  1. Tastenaktion zum Schreiben und auch zum Löschen von Beschriftung und Text bei wiederholtem Drücken der Taste wechselt beide Aktionen

  2. Zurück-in-Tastatur beim Drücken der Taste löst es Aktion aus und tritt auch Ersthelfer zurück

class ViewController: UIViewController, UITextFieldDelegate {
    
    @IBOutlet weak var textField1: UITextField!
    @IBOutlet weak var label1: UILabel!
    
    var buttonHasBeenPressed = false
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        textField1.delegate = self
    }
    
    
    @IBAction func buttonGo(_ sender: Any) {
        performAction()
    }
    
    
    
    
    
    
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        performAction()
        return true
    }
    
   
    func performAction() {
        buttonHasBeenPressed = !buttonHasBeenPressed
        
        if buttonHasBeenPressed == true {
            label1.text = textField1.text
        } else {
            textField1.text = ""
            label1.text = ""
        }
        
    }
    
}

Fausto Checa
quelle