Come ignorare la tastiera iOS a livello di codice quando si preme return

Ho creato un UITextField a UITextField programmazione rendendo UITextField una proprietà di viewController. Ho bisogno di chiudere la tastiera con il ritorno e il touch sullo schermo. Sono stato in grado di ottenere il touch screen per chiudere, ma premendo return non funziona.

Ho visto come farlo con gli storyboard e allocando e inizializzando direttamente l’object UITextField senza crearlo come proprietà. Possibile fare?

.h

 #import  @interface ViewController : UIViewController  @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 

Il modo più semplice è connettere il delegato di UITextField a self ( self.mytestField.delegate = self ) e chiudere la tastiera nel metodo textFieldShouldReturn usando [textField resignFirstResponder];

Un altro modo per eliminare la tastiera è il seguente:

 [self.view endEditing:YES]; 

Metti [self.view endEditing:YES]; dove si desidera chiudere la tastiera (evento Button, evento Touch, ecc.).

Aggiungi un metodo delegato di UITextField come questo:

 @interface MyController : UIViewController  

E imposta textField.delegate = self; quindi aggiungere anche due metodi delegate di UITextField

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

// Nasconde il keyBoard toccando lo sfondo in vista

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

semplicemente usa questo in modo rapido 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) 

Cerca di farti un’idea di cosa sia un first responder nella gerarchia delle viste di iOS. Quando il tuo campo di testo diventa attivo (o il primo che risponde) quando lo tocchi al suo interno (o passa il messasge a becomeFirstResponder programmaticamente), presenta la tastiera. Quindi, per rimuovere il tuo campo di testo dal primo resignFirstResponder , dovresti passare il messaggio resignFirstResponder lì.

 [textField resignFirstResponder]; 

E per hide la tastiera sul suo pulsante di ritorno, dovresti implementare il suo metodo delegate textFieldShouldReturn: e passare il messaggio resignFirstResponder .

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

Nel Delegato app, puoi scrivere

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

usa in questo modo, non puoi scrivere troppo codice.

Ecco cosa uso 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]; } 

SWIFT 4:

 self.view.endEditing(true) 

o

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

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

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

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

  1. quando UITextField si trova in un UIScrollView

  2. quando UITextField si trova all’esterno di UIScrollView

2.quando UITextField si trova all’esterno di UIScrollView, si modifica il metodo nella sottoclass UIViewController

è necessario aggiungere anche delegato per tutto UITextView

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; } 
  1. In una vista a scorrimento, Toccando fuori non si triggers alcun evento , quindi in tal caso utilizzare un Riconoscitore gesti touch , trascinare e rilasciare un UITapGesture per la vista di scorrimento e creare un’IBAzione per esso .

per creare un IBAction, premi ctrl + clic su UITapGesture e trascinalo nel file .h di viewcontroller.

Qui ho chiamato toccedEvent come nome della mia azione

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

l’informazione fornita è stata ricavata dal seguente link, fare riferimento per ulteriori informazioni o contattarmi se non si capiscono i dati di accesso.

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

Poiché i tag dicono solo iOS, inserirò la risposta per Swift 1.2 e iOs 8.4, aggiungendoli nella class swift del tuo controller di visualizzazione:

 // MARK: - Close keyboard when touching somewhere else override func touchesBegan(touches: Set, 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 class e impostare i campi di testo delegati su self (la vista).

Per un gruppo di UITextView s all’interno di un ViewController :

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

Per prima cosa è necessario aggiungere il delegete di textfield nel file .h. se non dichiarare (BOOL)textFieldShouldReturn:(UITextField *)textField questo metodo non chiamato.so prima aggiungere delegato e scrivere il codice della tastiera nascosta in quel metodo.

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

prova questo..

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

 .h #import  @interface ViewController : UIViewController  @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 

So che questo è stato risposto da altri, ma ho trovato l’altro articolo che riguardava anche per nessun evento di background – tableview o scrollview.

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

IN Swift 3

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

O

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

Aggiungi delegato: UITextFieldDelegate

 @interface ViewController : UIViewController  

e quindi aggiungere questo metodo delegato

// Questo dovrebbe funzionare perfettamente

 - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } 
 - (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 usi più di un campo di testo sullo schermo Con questo metodo non hai bisogno di menzionare campi di testo ogni volta che mi piace

 [textField1 resignFirstResponder]; [textField2 resignFirstResponder]; 

Swift 2:

questo è ciò che è fatto per fare ogni cosa!

chiudi la tastiera con il pulsante Done o Touch outSide , Next per passare all’ingresso successivo.

Prima modifica TextFiled Return Key To Next in 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) } 

Se non conosci il controller della vista corrente o la visualizzazione del testo, puoi utilizzare la Catena risponditore:

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

per 3-4 veloci ho risolto come

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

copia semplicemente pasta ovunque sulla class. Questa soluzione funziona solo se vuoi che tutte le UItextfield funzionino allo stesso modo o se ne hai una sola!