it-swarm.com.de

Wie lässt sich die Tastatur beim Bearbeiten eines UITextFields schließen?

Ich weiß, dass ich meinem UITextField mitteilen muss, dass er als Ersthelfer zurücktreten soll, wenn ich die Tastatur deaktivieren möchte, aber ich weiß nicht genau, wann der Benutzer die Taste "Fertig" auf der Tastatur gedrückt hat. Gibt es eine Benachrichtigung, auf die ich achten kann?

178
kubi

Ich setze den Delegaten von UITextField auf meine Klasse ViewController.

In dieser Klasse habe ich diese Methode folgendermaßen implementiert:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return NO;
}
347
kubi

Wenn Sie das DidEndOnExit-Ereignis des Textfelds mit einer Aktion (IBAction) in InterfaceBuilder verbinden, wird eine Meldung gesendet, wenn der Benutzer die Tastatur (mit der Eingabetaste) entfernt und der Absender auf das UITextField verweist, das das Ereignis ausgelöst hat.

Beispielsweise:

-(IBAction)userDoneEnteringText:(id)sender
{
    UITextField theField = (UITextField*)sender;
    // do whatever you want with this text field
}

Verknüpfen Sie dann in InterfaceBuilder das DidEndOnExit-Ereignis des Textfelds mit dieser Aktion auf Ihrem Controller (oder was auch immer Sie zum Verknüpfen von Ereignissen von der Benutzeroberfläche verwenden). Immer wenn der Benutzer Text eingibt und das Textfeld schließt, wird dem Controller diese Nachricht gesendet.

47
Jason Coco

Sie können auch eine Methode in Ihrem Controller erstellen

 -(IBAction)editingEnded:(id)sender{
    [sender resignFirstResponder]; 
}

und verbinden Sie dann im Verbindungsinspektor in IB das Ereignis "Did End On Exit" damit.

32
Hugo

kubi, danke. Ihr Code hat funktioniert. Nur um (für Neulinge wie) explizit zu sein, müssen Sie die UITextField 's delegate gleich dem ViewController setzen, in dem sich das Textfeld befindet. Sie können dies tun, wo immer Sie möchten. Ich habe die Methode viewDidLoad gewählt.

- (void)viewDidLoad 
{
    // sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
    daTextField.delegate = self;
}
19
alexander White

Hier ist ein Trick, um ein automatisches Tastaturentlassungsverhalten ohne Code zu erhalten. Bearbeiten Sie in der Schreibspitze das First Responder-Proxy-Objekt im Identitätsinspektor, und fügen Sie eine neue First Responder-Aktion hinzu. Nennen wir es dummy:. Verbinden Sie nun das Ereignis Did End on Exit des Textfelds mit der Aktion dummy: Des First Responder-Proxy-Objekts. Das ist es! Da das Ereignis Did End on Exit des Textfelds jetzt ein Aktions-Ziel-Paar enthält, wird die Tastatur des Textfelds automatisch ausgeblendet, wenn der Benutzer die Eingabetaste drückt. und da es keine Strafe gibt, keinen Handler für eine Nachricht zu finden, die die Antwortkette hochgeschickt wurde, stürzt die App nicht ab, obwohl nirgendwo dummy: implementiert ist.

18
matt

Einfach hinzufügen

[textField endEditing:YES];

hier möchten Sie die Tastatur deaktivieren und die Auswahlansicht anzeigen.

11
user415897

In Swift können Sie eine IBAction in den Controller schreiben und das Did End On Exit -Ereignis des Textfelds auf diese Aktion setzen

@IBAction func returnPressed(sender: UITextField) {
    self.view.endEditing(true)
}
9
Safin Ahmed

Sie können auch verwenden

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
  {

   [self.yourTextField resignFirstResponder];

  }

Am besten, wenn Sie viele Uitextfelder haben:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {    
     [self.view endEditing:YES];
 }
4
Metalhead1247

Hier ist, was ich tun musste, um es zum Laufen zu bringen, und ich denke, es ist für jeden notwendig, der einen Nummernblock für eine Tastatur hat (oder für jeden anderen, der keinen Fertig-Knopf hat:

  1. Ich habe das UIView im ViewController in ein UIControl geändert.
  2. Ich habe eine Funktion namens erstellt

    -(IBAction)backgroundIsTapped:(id)sender
    

Dies wurde auch in der .h-Datei definiert.

Danach habe ich im Interface Builder eine Verknüpfung zum 'Touch down'-Bit für den ViewController hergestellt.

In der Funktion "Hintergrund wird abgegriffen" stelle ich folgendes ein:

    [answerField resignFirstResponder];

Denken Sie daran, "answerField" in den Namen des UITextField zu ändern, von dem Sie die Tastatur entfernen möchten (stellen Sie sicher, dass Ihr UITextField wie unten definiert ist :)

    IBOutlet UITextField * <nameoftextfieldhere>;

Ich weiß, dass dieses Thema wahrscheinlich vor langer Zeit gestorben ist ... aber ich hoffe, dass dies irgendwo jemandem hilft!

2
Ryan Bourne

Sie werden feststellen, dass die Methode "textFieldShouldReturn" das Textfeldobjekt bereitstellt, das die Taste DONE gedrückt hat. Wenn Sie den TAG setzen, können Sie dieses Textfeld einschalten. Oder Sie können den Zeiger des Objekts mit einem vom Ersteller gespeicherten Elementwert verfolgen und vergleichen.

Mein Ansatz für ein Selbststudium ist wie folgt:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    bool fDidResign = [textField resignFirstResponder];

    NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");

    return fDidResign;
}

In der Zwischenzeit habe ich den "Validierungstest", der den Rücktritt bestreitet, durchgeführt. Dies dient nur zur Veranschaulichung. Wenn der Benutzer also NO! in das Feld wird es nicht entlassen. Das Verhalten war so, wie ich es wollte, aber die Reihenfolge der Ausgabe war nicht so, wie ich es erwartet hatte.

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    if( [[textField text] isEqualToString:@"NO!"] ) {
        NSLog(@"%@", textField.text);
        return NO;
    } else {
        return YES;
    }
}

Das Folgende ist meine NSLog-Ausgabe für diese Ablehnung, gefolgt von der Annahme. Sie werden bemerken, dass ich das Ergebnis des Rücktritts zurückschicke, aber ich habe erwartet, dass es FALSCH an mich zurückschickt, um mich beim Anrufer zu melden ?! Ansonsten hat es das nötige Verhalten.

 13.313 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldReturn:] 
 13.320 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldEndEditing:] 
 13.327 StudyKbd [109: 207] NO! 
 13.333 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldReturn:]: Tastatur wurde zurückgezogen 
 59.891 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldReturn:] 
 59.897 StudyKbd [109 : 207] - [StudyKbdViewController textFieldShouldEndEditing:] 
 59.917 StudyKbd [109: 207] - [StudyKbdViewController doneEditText]: NO 
 59.928 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldReturn:]: Wurde zurückgegeben Tastatur
2
mobibob

Swift 4.2 und es wird 100% funktionieren

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var textField: UITextField!


    override func viewDidLoad() {
        super.viewDidLoad()

        self.textField.delegate = self

    }

    // hide key board when the user touches outside keyboard

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }

    // user presses return key

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

}
1

wenn Sie alle Bearbeitungen in einem UIViewController vornehmen möchten, können Sie verwenden.

[[self view]endEditing:YES];

und wenn Sie eine bestimmte UITextField-Tastatur ausblenden möchten, verwenden Sie.

1.add delegieren Sie in Ihrem viewcontroller.h

<UITextFieldDelegate>
  1. delegierung kann nicht in Ihr Textfeld übernommen werden.

    self.yourTextField.delegate = self;

  2. fügen Sie diese Methode zu Ihrem Viewcontroller hinzu.

    - (BOOL) textFieldShouldEndEditing: (UITextField *) textField {[textField resignFirstResponder]; return YES;}

1

Programmgesteuert setzen Sie den Delegaten des UITextField in Swift 3

Implementieren Sie UITextFieldDelegate in Ihre ViewController.Swift-Datei (z. B. Klasse ViewController: UIViewController, UITextFieldDelegate {)

 lazy var firstNameTF: UITextField = {

    let firstname = UITextField()
    firstname.placeholder = "FirstName"
    firstname.frame = CGRect(x:38, y: 100, width: 244, height: 30)
    firstname.textAlignment = .center
    firstname.borderStyle = UITextBorderStyle.roundedRect
    firstname.keyboardType = UIKeyboardType.default
    firstname.delegate = self
    return firstname
}()

lazy var lastNameTF: UITextField = {

    let lastname = UITextField()
    lastname.placeholder = "LastName"
    lastname.frame = CGRect(x:38, y: 150, width: 244, height: 30)
    lastname.textAlignment = .center
    lastname.borderStyle = UITextBorderStyle.roundedRect
    lastname.keyboardType = UIKeyboardType.default
    lastname.delegate = self
    return lastname
}()

lazy var emailIdTF: UITextField = {

    let emailid = UITextField()
    emailid.placeholder = "EmailId"
    emailid.frame = CGRect(x:38, y: 200, width: 244, height: 30)
    emailid.textAlignment = .center
    emailid.borderStyle = UITextBorderStyle.roundedRect
    emailid.keyboardType = UIKeyboardType.default
    emailid.delegate = self
    return emailid
}()

// Markiere: - Handle delegate textField ..

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    view.endEditing(true)
}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    if textField == firstNameTF {

        lastNameTF.becomeFirstResponder()
    }

    else if textField == lastNameTF {

        emailIdTF.becomeFirstResponder()
    }
    else {
        view.emailIdTF(true)
    }
    return true
}
1
Tanjima

Hier ist eine sehr saubere Möglichkeit, die Ausgabe mit der Eingabetaste oder einem Touch im Hintergrund zu beenden.

Betten Sie im Builder für Schnittstelle Ihre Felder in eine Ansicht der Klasse UIFormView ein

Was macht diese Klasse:

  • Hängt sich automatisch als Stellvertreter für Felder an (entweder aus der Schreibspitze geweckt oder manuell hinzugefügt)
  • Behalten Sie eine Referenz auf dem aktuell bearbeiteten Feld
  • Schließen Sie die Tastatur bei der Rückkehr oder berühren Sie sie im Hintergrund

Hier ist der Code:

Schnittstelle

#import <UIKit/UIKit.h>

@interface UIFormView : UIView<UITextFieldDelegate>

-(BOOL)textFieldValueIsValid:(UITextField*)textField;
-(void)endEdit;

@end

Implementierung

#import "UIFormView.h"

@implementation UIFormView
{
    UITextField* currentEditingTextField;
}

// Automatically register fields

-(void)addSubview:(UIView *)view
{
    [super addSubview:view];
    if ([view isKindOfClass:[UITextField class]]) {
        if ( ![(UITextField*)view delegate] ) [(UITextField*)view setDelegate:self];
    }
}

// UITextField Protocol

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    currentEditingTextField = textField;
}

-(void)textFieldDidEndEditing:(UITextField *)textField
{
    currentEditingTextField = NULL;
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self endEdit];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if ([self textFieldValueIsValid:textField]) {
        [self endEdit];
        return YES;
    } else {
        return NO;
    }
}

// Own functions

-(void)endEdit
{
    if (currentEditingTextField) {
        [currentEditingTextField endEditing:YES];
        currentEditingTextField = NULL;
    }
}


// Override this in your subclass to handle eventual values that may prevent validation.

-(BOOL)textFieldValueIsValid:(UITextField*)textField
{
    return YES;
}

@end
  • Durch Unterklassen des Formulars und Überschreiben des textFieldValueIsValid: können Sie das Ende der Ausgabe vermeiden, wenn der Wert für das angegebene Feld nicht korrekt ist.

  • Wenn für ein Feld in Interface Builder ein Delegat festgelegt ist, wird es vom Formular nicht geändert. Ich sehe nicht viele Gründe, einen anderen Delegierten für ein bestimmtes Feld zu engagieren, aber warum nicht ...

Es gibt viele Möglichkeiten, um diese Formularansichtsklasse zu verbessern - Fügen Sie einen Delegaten hinzu, führen Sie ein Layout durch, bearbeiten Sie, wenn die Tastatur ein Feld abdeckt (unter Verwendung des aktuellen Textfeld-Rahmens), starten Sie die Bearbeitung für das nächste Feld automatisch, ...

Ich persönlich behalte es in meinem Framework und ordne es immer in Unterklassen ein, um Features hinzuzufügen. Es ist ziemlich oft nützlich, so wie es ist.

Ich hoffe es wird helfen. Alles Gute

1
Moose
//====================================================
//                  textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField { 
    [textField resignFirstResponder];
    if(textField.returnKeyType != UIReturnKeyDone){
        [[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
    }
    return YES;
}
0
jake

versuche dies

- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
    if ([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    return YES;
}
0
Vineesh TP

So entlasse ich die Tastatur in Swift 4.2 und es funktioniert für mich:

    override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: 
    #selector(dismissKeyboard))

    view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
    numberField.resignFirstResponder()
    }

Wer sucht Swift

1) Stellen Sie sicher, dass Ihr ITextFields Delegierter mit Ihrem ViewController im Storyboard verbunden ist

2) Implementieren Sie ITextFieldDelegate in Ihre ViewController.Swift-Datei (z. B. Klasse ViewController: UIViewController, UITextFieldDelegate {).

3) Verwenden Sie die unten stehende Delegierungsmethode

func textFieldShouldReturn(textField: UITextField) -> Bool { 
   textField.resignFirstResponder()  
return false }
0
Burf2000

Wenn Sie die Ansicht mit Interface Builder erstellt haben, verwenden Sie Folgendes: Erstellen Sie einfach eine Methode,

-(IBAction)dismissKeyboard:(id)sender
{
[sender resignFirstResponder];
}

Klicken Sie einfach mit der rechten Maustaste auf das Textfeld in der Ansicht, setzen Sie das Ereignis auf "Did End on Exit" und verbinden Sie es mit der Methode "dismissKeyboard".

Der beste Leitfaden für Anfänger ist "Head First iPhone und iPad Development, 2nd Edition".

0
chandru

Erstellen Sie ein Funktions-Hide-Keyboard, verknüpfen Sie es mit dem Textfeld in der .xib-Datei und wählen Sie DidEndOnExit

-(IBAction)Hidekeyboard    
{    
      textfield_name.resignFirstResponder;    
}  
0
pooja_chaudhary