Come chiudere la tastiera iOS a livello di codice quando si preme Invio


105

Ho creato un file UITextFieldprogrammaticamenteUITextField proprietà della viewController. Devo chiudere la tastiera con il ritorno e il tocco sullo schermo. Sono riuscito a chiudere lo schermo con il tocco, ma premere Invio non funziona.

Ho visto come farlo con gli storyboard e allocando e inizializzando il file UITextField oggetto direttamente senza crearlo come proprietà. Possibile fare?

.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

Risposte:


265

Il modo semplice è connettere il delegato di UITextFielda self ( self.mytestField.delegate = self) e chiudere la tastiera nel metodo textFieldShouldReturnusing[textField resignFirstResponder];

Un altro modo per chiudere la tastiera è il seguente:

[self.view endEditing:YES];

Posiziona il punto in [self.view endEditing:YES];cui desideri chiudere la tastiera (evento pulsante, evento tocco, ecc.).


quando collego il delegato, tuttavia, ricevo avvisi e / o errori. Ho già visto la tua strada, ma per qualche motivo non riesco a farlo funzionare. Questi metodi dovrebbero essere visualizzati in viewDidLoad?
noobsmcgoobs

1
Se ricevi degli errori quando hai provato a impostare il delegato textField su self, probabilmente non hai aggiunto UITextFieldDelegate alla definizione della classe. In particolare ... class ViewController: UIViewController, UITextFieldDelegate {...
TimWhiting

29

Aggiungi un metodo delegato UITextFieldcome questo:

@interface MyController : UIViewController <UITextFieldDelegate>

E imposta il tuo, textField.delegate = self;quindi aggiungi anche due metodi delegati diUITextField

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

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

Dovremmo aggiungere che quanto sopra funziona solo se il tuo controller implementa UITextFieldDelegate in questo modo: @interface MyController : UIViewController <UITextFieldDelegate>
DerWOK

@iPatel Ho inserito questi 2 metodi e ho anche aggiunto self.username.delegate = self e [self.username resignFirstResponder] in viewDidLoad. Funziona per entrambi gli scenari di cui avevo bisogno. È normale o sto usando troppo codice?
noobsmcgoobs

26

// Nasconde la tastiera toccando lo sfondo in vista

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

24

usalo rapidamente per chiudere la tastiera:

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)

o

Imposta il delegato del campo di testo sul viewcontroller corrente e quindi:

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

    textField.resignFirstResponder()

    return true

}

Objective-C:

[self.view endEditing:YES];

o

Imposta il delegato del campo di testo sul viewcontroller corrente e quindi:

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

    return YES;
}

9

Nell'app Delegate puoi scrivere

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

usa in questo modo, non puoi scrivere troppo codice.


7

Prova a farti un'idea di cosa sia un primo risponditore nella gerarchia della vista iOS. Quando il tuo campo di testo diventa attivo (o primo risponditore) quando lo tocchi al suo interno (o gli passi il messaggio a livello di becomeFirstResponderprogrammazione), presenta la tastiera. Quindi, per rimuovere il tuo campo di testo dall'essere il primo risponditore, dovresti passargli il messaggio resignFirstResponderlì.

[textField resignFirstResponder];

E per nascondere la tastiera sul suo pulsante di ritorno, dovresti implementare il suo metodo delegato textFieldShouldReturn:e passare il resignFirstRespondermessaggio.

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

7

Ecco cosa utilizzo nel mio codice. Esso funziona magicamente!

In yourviewcontroller.h aggiungi:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

Ora nel file .m, aggiungilo alla funzione ViewDidLoad:

- (void)viewDidLoad {
    [super viewDidLoad];

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

Inoltre, aggiungi questa funzione nel file .m:

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

1
ricorda solo l'azione: @selector dovrebbe chiamare lo stesso nome del metodo in cui esegui endEditing: YES, in questo caso "handleSingleTap:"
Marcos Reboucas

4

Per chiudere una tastiera dopo che la tastiera è comparsa, ci sono 2 casi ,

  1. quando UITextField si trova all'interno di un UIScrollView

  2. quando UITextField è esterno a UIScrollView

2.quando UITextField è esterno a UIScrollView, sovrascrivi il metodo nella tua sottoclasse UIViewController

è inoltre necessario aggiungere delegato per tutto UITextView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. In una visualizzazione a scorrimento, il tocco all'esterno non attiverà alcun evento , quindi in tal caso utilizzare un Riconoscimento gestuale del tocco , trascinare e rilasciare un UITapGesture per la visualizzazione a scorrimento e creare un'IBAction per esso .

per creare un'IBAction, premere ctrl + clic su UITapGesture e trascinarlo nel file .h di viewcontroller.

Qui ho chiamato tappedEvent come nome dell'azione

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

le informazioni fornite sopra sono derivate dal seguente collegamento, fare riferimento per ulteriori informazioni o contattarmi se non si comprendono i dati di cui sopra.

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


Grazie. La tua risposta mi ha aiutato ..!
Archit Kapoor

4

Per un gruppo di UITextViews all'interno di un fileViewController :

Swift 3.0

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

Objective-C

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


3

Poiché i tag dicono solo che iOS pubblicherò la risposta per Swift 1.2 e iOs 8.4, aggiungili nella classe swift del tuo controller di visualizzazione:

// 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: -

Inoltre, non dimenticare di aggiungere UITextFieldDelegate nella dichiarazione della classe e impostare il delegato dei campi di testo su self (la vista).


3

IN Swift 3

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

O

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

2

Quindi ecco cosa ho fatto per farlo chiudere dopo aver toccato lo sfondo o tornare indietro. Ho dovuto aggiungere delegate = self in viewDidLoad e quindi anche i metodi delegate più avanti nei file .m.

.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

Usalo semplicemente in Objective-C per chiudere la tastiera:

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

1

Per prima cosa devi aggiungere il delegato del campo di testo nel file .h. in caso contrario, dichiara che (BOOL)textFieldShouldReturn:(UITextField *)textFieldquesto metodo non è stato chiamato, quindi aggiungi prima il delegato e scrivi il codice per nascondere la tastiera in quel metodo.

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

prova questo..


0

Aggiungi delegato: UITextFieldDelegate

@interface ViewController : UIViewController <UITextFieldDelegate>

e quindi aggiungi questo metodo delegato

// Dovrebbe funzionare perfettamente

- (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];
    }
}];
}

quando si utilizza più di un campo di testo sullo schermo Con questo metodo non è necessario menzionare il campo di testo ogni volta come

[textField1 resignFirstResponder];
[textField2 resignFirstResponder];

0

Swift 2:

questo è quello che si fa per fare ogni cosa!

chiudere la tastiera con il Donetasto o Touch outSide, Nextper passare all'input successivo.

Primo cambio TextFiled Return KeyPer Nextdi 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

Se non conosci il controller di visualizzazione corrente o la visualizzazione di testo, puoi utilizzare la catena di risponditori:

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

0

per swift 3-4 ho risolto il problema

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

copia e incolla in un punto qualsiasi della classe. Questa soluzione funziona solo se vuoi che tutti i campi di testo UI funzionino allo stesso modo o se ne hai solo uno!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.