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
noobsmcgoobs
quelle

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.).

Nitin Gohel
quelle
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;
}
iPatel
quelle
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];
}
Vijay Dokrimare
quelle
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)
Chathuranga Silva
quelle
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;
}
Sam
quelle
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.

DKong
quelle
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;
}
Zen
quelle
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];
}
Takide
quelle
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/


quelle
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];
    }
}
Matias Elorriaga
quelle
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.

Juan Boero
quelle
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)
        }
    }
Amul4608
quelle
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
noobsmcgoobs
quelle
2

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

[[UIApplication sharedApplication].keyWindow endEditing:YES];
Linc
quelle
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..

Jitendra
quelle
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;
}
Ravi_Parmar
quelle
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];
Harshad
quelle
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)
}
Mojtabye
quelle
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)
kaltes Feuer
quelle
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!

hall.keskin
quelle