Frage

Ich weiß, dass ich meine UITextField sagen, Ersthelfer, zurückzutreten, wenn ich die Tastatur dismis will, aber ich bin nicht sicher, wie Sie wissen, wenn der Benutzer den „Fertig“ -Taste auf der Tastatur gedrückt hat. Gibt es eine Benachrichtigung ich beobachten kann?

War es hilfreich?

Lösung

Ich habe die Delegierten des UITextField meiner ViewController Klasse.

In dieser Klasse implementiert ich diese Methode wie folgt:

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

Andere Tipps

Wenn Sie das DidEndOnExit Ereignis des Textfeldes zu einer Aktion (IBAction) in Interface verbinden, wird es messaged, wenn der Benutzer die Tastatur entlässt (mit der Return-Taste) und der Absender wird ein Verweis auf die UITextField, die gefeuert das Ereignis.

Zum Beispiel:

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

Dann in Interfacebuilder, verbinden das DidEndOnExit Ereignis des Textfeldes zu dieser Aktion auf dem Controller (oder was auch immer Sie verwenden Ereignisse aus dem UI zu verbinden). Jedes Mal, wenn der Benutzer Text eingibt und entlässt das Textfeld, wird der Controller diese Nachricht gesendet werden.

Sie können auch ein Verfahren, in dem Controller erstellen

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

und dann im Anschluss Inspector in IB verbindet Ereignis, um es "Hat On Exit Ende".

kubi, danke. Der Code funktioniert. Nur um explizit zu sein (für Anfänger wie), wie Sie sagen, Sie haben die UITextField des delegate einzustellen auf die Viewcontroller, um gleich in dem das Textfeld befindet. Sie können dies tun, wo immer Sie bitte. Ich wählte die viewDidLoad Methode.

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

Hier ist ein Trick für überhaupt ohne Code automatisches Tastatur Entlassung Verhalten zu bekommen. In der Spitze, bearbeiten Sie das Proxy-First Responder-Objekt in dem Inspektoren Identität, eine neue Ersthelfer Aktion hinzuzufügen; nennen wir es dummy:. auf die dummy: Wirkung des First Responder-Proxy-Objekt haben Sie am Ende auf Exit-Ereignis des Textfeldes nun der Haken. Das ist es! Da das Ende des Textfelds auf Exit-Ereignis Hat hat jetzt eine Aktion-Zielpaar, entlässt das Textfeld automatisch die Tastatur, wenn der Benutzer Return tippt; und da gibt es keine Strafe für nicht einen Handler für eine Nachricht zu finden, die Responder-Kette geschickt, die App auch dann nicht zum Absturz bringen, obwohl es keine Implementierung von dummy: ist überall.

Fügen Sie einfach

[textField endEditing:YES];

, wo Sie wollen Tastatur deaktivieren und die Picker-Ansicht angezeigt werden.

In Swift können Sie einen IBAction im Controller schreiben und stellen Sie die Did End On Exit Ereignis des Textfeldes zu dieser Aktion

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

Sie können auch verwenden

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

   [self.yourTextField resignFirstResponder];

  }

Best ein, wenn Sie viele UITextFields haben:

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

Hier ist, was ich musste es tun, um zu arbeiten, und ich denke, ist notwendig für jedermann mit einem Nummernblock für eine Tastatur (oder irgendwelche andere, die ohne getan Taste:

  1. Ich habe die UIView in dem Viewcontroller zu einem UIControl.
  2. Ich habe eine Funktion namens

    -(IBAction)backgroundIsTapped:(id)sender
    

Dies wurde auch in der H-Datei definiert ist.

Nach diesem verknüpft ich auf das Bit 'touch down' für die Viewcontroller in Interface Builder.

Im ‚Hintergrund abgegriffen‘ Funktion, ich habe dies:

    [answerField resignFirstResponder];

Denken Sie daran, ändern ‚answerField‘ auf den Namen des UITextField möchten, dass Sie die Tastatur entfernen (natürlich sicherstellen, dass Ihre UITextField wie unten definiert:)

    IBOutlet UITextField * <nameoftextfieldhere>;

Ich weiß, dass dieses Thema wahrscheinlich vor langer Zeit gestorben ... aber ich hoffe, das jemanden helfen, irgendwo!

Sie werden feststellen, dass die Methode „textFieldShouldReturn“ liefert den Text-Feld Objekt, das die DONE Taste getroffen hat. Wenn Sie den TAG einstellen können Sie auf diesem Textfeld wechseln. Oder Sie können die Objektzeiger mit einem Mitglied Wert verfolgen und vergleichen von seinem Schöpfer gespeichert.

Mein Ansatz wie dieser ist für ein Selbststudium:

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

    bool fDidResign = [textField resignFirstResponder];

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

    return fDidResign;
}

Inzwischen Ich habe die „Validierung“ Test, der den Rücktritt verweigert folgt. Es ist nur zur Veranschaulichung, so dass, wenn der Benutzer tippt NO! in das Feld wird es nicht entlassen. Das Verhalten war, wie ich wollte, aber die Reihenfolge der Ausgabe war nicht wie ich erwartet hatte.

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

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

Im Anschluss an meine NSLog Ausgabe für diese Verweigerung der Annahme gefolgt. Sie werden feststellen, dass ich das Ergebnis der Rücktritt zurückkehre, aber ich erwartete es FALSCH mir zurückzukehren, um den Anrufer zu berichten ?! Abgesehen davon, hat es das notwendige 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:]: did resign the keyboard
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:]: did resign the keyboard

Hier ist eine ganz saubere Art und Weise Ausgabe mit der Return-Taste oder einer Berührung im Hintergrund zu beenden.

In Interface Builder, betten Sie Ihre Felder in einer Ansicht der Klasse UIFormView

Was bedeutet diese Klasse:

  • Automatisch anhängen sich als Felder delegieren (entweder von nib awaked oder manuell hinzugefügt)
  • Halten Sie einen Verweis auf die aktuelle bearbeitete Feld
  • Entlassen Sie die Tastatur auf Rückkehr oder berühren 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
  • Mit dem Subklassen der Form und die zwingenden textFieldValueIsValid: Methode, Sie kann Ende Ausgabe vermeiden, wenn der Wert nicht korrekt für die gegebene ist Feld.

  • Wenn ein Feld einen Delegaten festgelegt in Interface Builder hat, dann wird das Formular nicht ändern. Ich sehe nicht viele Gründe, einen anderen Delegierten zu einem bestimmten Feld zu setzen, aber warum nicht ...

Es gibt viele Möglichkeiten, diese Form Ansichtsklasse zu verbessern - Befestigen Sie einen Delegaten, einige Layout tun, behandeln, wenn die Keyboards einen Bereich betrifft (die currentEditingTextField Rahmen verwendet wird), automatisch Ausgabe für das nächste Feld zu starten, ...

Ich halte es persönlich in meinem Rahmen, und es ist immer eine Unterklasse Funktionen hinzuzufügen, ist es oft sinnvoll ist „wie sie ist“.

Ich hoffe, es wird hilft. Prost alle

Wenn Sie alle Bearbeitungen von in einem UIViewController möchten, können Sie verwenden.

[[self view]endEditing:YES];

und wenn Sie eine perticular UITextField Tastatur verstecken abtun wollen, dann verwenden.

1.Add Delegat in Ihrem viewcontroller.h

<UITextFieldDelegate>
  1. Delegation nicht in Ihrem Textfeld machen.

    self.yourTextField.delegate = self;

  2. Fügen Sie diese Methode in Ihrem Viewcontroller.

    - (BOOL) textFieldShouldEndEditing: (UITextField *) {textfield [Textfield ResignFirstResponder]; Rückkehr YES;}

Programmatically stellen Sie die Delegierten des UITextField in swift 3

Implementieren UITextFieldDelegate in Ihrer ViewController.Swift Datei (z 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
}()

// Mark: - Umgang mit Delegierten .. 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
}

Erstellen Sie eine Funktion hidekeyboard und verknüpft es mit dem Textfeld in der .xib Datei und wählen Sie DidEndOnExit

-(IBAction)Hidekeyboard    
{    
      textfield_name.resignFirstResponder;    
}  

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

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

Genau richtig für das Textfeld in der Ansicht klicken, und das Ereignis eingestellt wie beim Beenden End Did und Draht an die Methode „dismissKeyboard“.

Die beste Anleitung für Anfänger       "Head First iPhone und iPad Entwicklung, 2nd Edition"

try this

- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
    if ([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    return YES;
}
//====================================================
//                  textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField { 
    [textField resignFirstResponder];
    if(textField.returnKeyType != UIReturnKeyDone){
        [[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
    }
    return YES;
}

Wer auf der Suche nach Swift 3

1) Stellen Sie sicher, dass Ihr UITextField die Delegierten Ihren Viewcontroller in der Storyboard-verdrahtet ist

2) Implementieren Sie UITextFieldDelegate in Ihrem ViewController.Swift Datei (z Klasse Viewcontroller: UIViewController, UITextFieldDelegate {)

3) Mit dem Delegatmethode unterhalb

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

Dies ist, wie ich die Tastatur in Swift 4.2 entlassen 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()
    }

Swift 3, iOS 9 +

@IBAction private func noteFieldDidEndOnExit(_ sender: UITextField) {}

UPD: Es ist immer noch funktioniert gut für mich. Ich denke, Mann, dass diese Antwort gewidmet einfach nicht verstehen, dass er auf dem Storyboard diese Aktion an die UITextField binden muss.

textField.returnKeyType = UIReturnKeyDone;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top