So schließen Sie die Tastatur iOS programmgesteuert, wenn Sie die Eingabetaste drücken


105

Ich habe ein UITextFieldprogrammgesteuertes UITextFieldErstellen der Eigenschaft a des viewController erstellt. Ich muss die Tastatur mit der Rückkehr und der Berührung auf dem Bildschirm schließen. Ich konnte den Bildschirm berühren lassen, aber das Drücken der Eingabetaste funktioniert nicht.

Ich habe gesehen, wie man es mit Storyboards macht und indem man das UITextFieldObjekt direkt zuweist und initialisiert, ohne es als Eigenschaft zu erstellen. Möglich zu tun?

.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>

@property (strong, atomic) UITextField *username;

@end

.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // Do any additional setup after loading the view, typically from a nib.
    
    self.view.backgroundColor = [UIColor blueColor];
    self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)];
    self.username.placeholder = @"Enter your username";
    self.username.backgroundColor = [UIColor whiteColor];
    self.username.borderStyle = UITextBorderStyleRoundedRect;
    if (self.username.placeholder != nil) {
        self.username.clearsOnBeginEditing = NO;
    }
    _username.delegate = self; 
    
    [self.view addSubview:self.username];
    [_username resignFirstResponder];
    
}

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

@end

Antworten:


265

Die einfache Möglichkeit besteht darin, den Delegaten von UITextFieldmit self ( self.mytestField.delegate = self) zu verbinden und die Tastatur in der Methode textFieldShouldReturnmit zu schließen[textField resignFirstResponder];

Eine andere Möglichkeit, die Tastatur zu schließen, ist die folgende:

[self.view endEditing:YES];

Legen [self.view endEditing:YES];Sie fest, wo Sie die Tastatur schließen möchten (Button-Ereignis, Touch-Ereignis usw.).


Wenn ich den Delegaten verbinde, erhalte ich jedoch Warnungen und / oder Fehler. Ich habe Ihren Weg schon einmal gesehen, kann ihn aber aus irgendeinem Grund nicht zum Laufen bringen. Würden diese Methoden in viewDidLoad verwendet?
Noobsmcgoobs

1
Wenn beim Versuch, den textField-Delegaten auf self zu setzen, Fehler aufgetreten sind, haben Sie der Klassendefinition wahrscheinlich kein UITextFieldDelegate hinzugefügt. Speziell ... Klasse ViewController: UIViewController, UITextFieldDelegate {...
TimWhiting

29

Fügen Sie eine Delegate-Methode UITextFieldwie folgt hinzu:

@interface MyController : UIViewController <UITextFieldDelegate>

Und stellen Sie textField.delegate = self;dann auch zwei Delegatenmethoden von einUITextField

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

// It is important for you to hide the keyboard
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

Wir sollten hinzufügen, dass das oben genannte nur funktioniert, wenn Ihr Controller das UITextFieldDelegate wie folgt implementiert: @interface MyController : UIViewController <UITextFieldDelegate>
DerWOK

@iPatel Ich habe diese beiden Methoden eingefügt und auch self.username.delegate = self und [self.username resignFirstResponder] in viewDidLoad hinzugefügt. Dies funktioniert für beide Szenarien, die ich brauchte. Ist das normal oder verwende ich zu viel Code?
Noobsmcgoobs

26

// KeyBoard ausblenden, indem Sie den Hintergrund in der Ansicht berühren

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

24

Verwenden Sie dies einfach schnell, um die Tastatur zu schließen:

UIApplication.sharedApplication().sendAction("resignFirstResponder", to:nil, from:nil, forEvent:nil)

Swift 3

UIApplication.shared.sendAction(#selector(UIResponder.resign‌​FirstResponder), to: nil, from: nil, for: nil)

SWIFT 3UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
miff

17

SWIFT 4:

self.view.endEditing(true)

oder

Stellen Sie den Delegaten des Textfelds auf den aktuellen Ansichtscontroller ein und dann:

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

    textField.resignFirstResponder()

    return true

}

Ziel c:

[self.view endEditing:YES];

oder

Stellen Sie den Delegaten des Textfelds auf den aktuellen Ansichtscontroller ein und dann:

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

    return YES;
}

9

Im App-Delegaten können Sie schreiben

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

Auf diese Weise können Sie nicht zu viel Code schreiben.


7

Versuchen Sie, eine Vorstellung davon zu bekommen, was ein Ersthelfer in der Hierarchie der iOS-Ansicht ist. Wenn Ihr Textfeld aktiv wird (oder der Ersthelfer), wenn Sie es berühren (oder das Messasge becomeFirstResponderprogrammgesteuert übergeben), wird die Tastatur angezeigt . Um Ihr Textfeld als Ersthelfer zu entfernen, sollten Sie die Nachricht resignFirstResponderdort weiterleiten .

[textField resignFirstResponder];

Um die Tastatur auf der Eingabetaste auszublenden, sollten Sie die Delegate-Methode implementieren textFieldShouldReturn:und die resignFirstResponderNachricht übergeben.

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

7

Folgendes verwende ich in meinem Code. Es wirkt wie ein Zauber!

Fügen Sie in yourviewcontroller.h Folgendes hinzu:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

Fügen Sie dies nun in der .m-Datei Ihrer ViewDidLoad-Funktion hinzu:

- (void)viewDidLoad {
    [super viewDidLoad];

    //Keyboard stuff
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    tapRecognizer.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapRecognizer];
}

Fügen Sie diese Funktion auch in die .m-Datei ein:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}

1
Denken Sie nur an die Aktion: @selector sollte denselben Methodennamen aufrufen, unter dem Sie endEditing ausführen: YES, in diesem Fall "handleSingleTap:"
Marcos Reboucas

4

Um eine Tastatur zu schließen, nachdem die Tastatur aufgetaucht ist, gibt es zwei Fälle :

  1. wenn sich das UITextField in einer UIScrollView befindet

  2. wenn sich das UITextField außerhalb einer UIScrollView befindet

2.Wenn sich das UITextField außerhalb einer UIScrollView befindet, überschreiben Sie die Methode in Ihrer UIViewController-Unterklasse

Sie müssen auch einen Delegaten für alle UITextView hinzufügen

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. In einer Bildlaufansicht löst das Tippen auf " Außen" kein Ereignis aus. Verwenden Sie in diesem Fall einen Tap- Gestenerkenner. Ziehen Sie eine UITapGesture für die Bildlaufansicht und legen Sie sie ab, und erstellen Sie eine IBAction dafür .

Um eine IBAction zu erstellen, drücken Sie Strg + Klicken Sie auf die UITapGesture und ziehen Sie sie in die .h-Datei von viewcontroller.

Hier habe ich tappedEvent als meinen Aktionsnamen benannt

- (IBAction)tappedEvent:(id)sender {
      [self.view endEditing:YES];  }

Die oben angegebenen Informationen wurden über den folgenden Link abgeleitet. Weitere Informationen erhalten Sie von mir oder wenn Sie die oben genannten Daten nicht verstehen.

http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/


Vielen Dank. Ihre Antwort hat mir geholfen ..!
Archit Kapoor

4

Für eine Gruppe von UITextViews in a ViewController:

Swift 3.0

for view in view.subviews {
    if view is UITextField {
        view.resignFirstResponder()
    }
}

Ziel c

// hide keyboard before dismiss
for (UIView *view in [self.view subviews]) {
    if ([view isKindOfClass:[UITextField class]]) {
        // no need to cast
        [view resignFirstResponder];
    }
}


3

Da auf den Tags nur iOS steht, werde ich die Antwort für Swift 1.2 und iOs 8.4 veröffentlichen. Fügen Sie diese in Ihre Swift-Klasse für View Controller ein:

// MARK: - Close keyboard when touching somewhere else
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

    self.view.endEditing(true)

}

// MARK: - Close keyboard when return pressed
func textFieldShouldReturn(textField: UITextField!) -> Bool {

    textField.resignFirstResponder()

    return true
}
// MARK: -

Vergessen Sie auch nicht, UITextFieldDelegate in die Klassendeklaration aufzunehmen und Ihre Textfelder auf self (die Ansicht) zu delegieren.


3

IN Swift 3

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

ODER

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if textField == yourtextfieldName
        {
            self.resignFirstResponder()
            self.view.endEditing(true)
        }
    }

2

Also hier ist, was ich getan habe, um es zu entlassen, nachdem ich den Hintergrund berührt oder zurückgekehrt bin. Ich musste das delegate = self in viewDidLoad und später auch die delegate-Methoden in den .m-Dateien hinzufügen.

.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>


@property (strong, atomic) UITextField *username;

@end

.m
- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    self.view.backgroundColor = [UIColor blueColor];
    self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)];
    self.username.placeholder = @"Enter your username";
    self.username.backgroundColor = [UIColor whiteColor];
    self.username.borderStyle = UITextBorderStyleRoundedRect;
    if (self.username.placeholder != nil) {
        self.username.clearsOnBeginEditing = NO;
    }
    self.username.delegate = self;
    [self.username resignFirstResponder];
    [self.view addSubview:self.username];


}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


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



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

@end

2

Verwenden Sie dies einfach in Objective-C, um die Tastatur zu schließen:

[[UIApplication sharedApplication].keyWindow endEditing:YES];

1

Zuerst müssen Sie einen Textfelddelegeten in die .h-Datei einfügen. Wenn nicht, deklarieren Sie (BOOL)textFieldShouldReturn:(UITextField *)textFielddiese Methode als nicht aufgerufen. Fügen Sie also zuerst einen Delegaten hinzu und schreiben Sie den Code zum Ausblenden der Tastatur in diese Methode.

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

Probier diese..


0

Delegat hinzufügen: UITextFieldDelegate

@interface ViewController : UIViewController <UITextFieldDelegate>

und fügen Sie dann diese Delegatmethode hinzu

// Das sollte perfekt funktionieren

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

0
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view.subviews enumerateObjectsUsingBlock:^(UIView* obj, NSUInteger idx, BOOL *stop) {
    if ([obj isKindOfClass:[UITextField class]]) {
        [obj resignFirstResponder];
    }
}];
}

Wenn Sie mehr als ein Textfeld im Bildschirm verwenden Bei dieser Methode müssen Sie das Textfeld nicht jedes Mal wie erwähnen

[textField1 resignFirstResponder];
[textField2 resignFirstResponder];

0

Swift 2:

Das ist es, was getan wird, um alles zu tun!

Schließen Sie die Tastatur mit der DoneTaste oder Touch outSide, Nextum zur nächsten Eingabe zu gelangen.

Ändern Sie zuerst TextFiled Return KeyTo Nextin StoryBoard.

override func viewDidLoad() {
  txtBillIdentifier.delegate = self
  txtBillIdentifier.tag = 1
  txtPayIdentifier.delegate  = self
  txtPayIdentifier.tag  = 2

  let tap = UITapGestureRecognizer(target: self, action: "onTouchGesture")
  self.view.addGestureRecognizer(tap)

}

func textFieldShouldReturn(textField: UITextField) -> Bool {
   if(textField.returnKeyType == UIReturnKeyType.Default) {
       if let next = textField.superview?.viewWithTag(textField.tag+1) as? UITextField {
           next.becomeFirstResponder()
           return false
       }
   }
   textField.resignFirstResponder()
   return false
}

func onTouchGesture(){
    self.view.endEditing(true)
}

0

Wenn Sie den aktuellen View Controller oder die Textansicht nicht kennen, können Sie die Responder-Kette verwenden:

UIApplication.shared.sendAction(#selector(UIView.endEditing(_:)), to:nil, from:nil, for:nil)

0

für schnelle 3-4 habe ich gerne behoben

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    return false
}

Kopieren Sie einfach Einfügen an einer beliebigen Stelle in der Klasse. Diese Lösung funktioniert nur, wenn alle UItextfelder gleich funktionieren sollen oder wenn Sie nur eines haben!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.