Ich habe eine ganze Reihe von Steuerelementen, die über viele Tabellenzellen in meiner Tabelle verstreut sind, und ich frage mich, ob es einen einfacheren Weg gibt, die Tastatur zu deaktivieren, ohne alle meine Steuerelemente in einer Schleife durchlaufen zu müssen und sie alle als erste Antwort zurücktreten zu lassen. Ich schätze, die Frage ist: Wie würde ich den aktuellen ersten Responder auf die Tastatur bekommen?
Antworten
Zu viele Anzeigen?Sie können die aktuell bearbeitende Ansicht dazu zwingen, ihren First-Responder-Status aufzugeben mit [view endEditing:YES]
. Dadurch wird die Tastatur ausgeblendet.
Anders als -[UIResponder resignFirstResponder]
, -[UIView endEditing:]
durchsucht die Unteransichten, um den aktuellen Ersthelfer zu finden. Sie können es also an Ihre Top-Level-Ansicht senden (z.B. self.view
in einem UIViewController
) und es wird das Richtige tun.
(Diese Antwort enthielt zuvor eine Reihe anderer Lösungen, die ebenfalls funktionierten, aber komplizierter waren als nötig. Ich habe sie entfernt, um Verwirrung zu vermeiden.)
Sie können der Anwendung eine Aktion mit dem Ziel "Null" senden, und sie wird jederzeit den First-Responder-Status aufgeben, ohne dass Sie sich darum kümmern müssen, welche Ansicht gerade den First-Responder-Status hat.
Objektiv-C:
[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
Swift 3.0:
UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)
Gezielte Nil-Aktionen sind unter Mac OS X für Menübefehle üblich, und hier ist eine Verwendung für sie unter iOS.
Um ehrlich zu sein, bin ich von keiner der hier vorgeschlagenen Lösungen begeistert. Ich habe einen netten Weg gefunden, einen TapGestureRecognizer zu verwenden, der meiner Meinung nach den Kern Ihres Problems trifft: Wenn Sie auf etwas anderes als die Tastatur klicken, schließen Sie die Tastatur.
-
In viewDidLoad registrieren Sie sich für den Empfang von Tastaturbenachrichtigungen und erstellen einen UITapGestureRecognizer:
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc addObserver:self selector:@selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object:nil]; [nc addObserver:self selector:@selector(keyboardWillHide:) name: UIKeyboardWillHideNotification object:nil]; tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapAnywhere:)];
-
Hinzufügen der Tastatur zum Ein- und Ausblenden der Antwortenden. Dort fügen Sie der UIView den TapGestureRecognizer hinzu, der die Tastatur beim Antippen ausblenden soll, und entfernen ihn wieder. Hinweis: Sie müssen ihn nicht zu allen Unteransichten oder Steuerelementen hinzufügen.
-(void) keyboardWillShow:(NSNotification *) note { [self.view addGestureRecognizer:tapRecognizer]; } -(void) keyboardWillHide:(NSNotification *) note { [self.view removeGestureRecognizer:tapRecognizer]; }
-
Der TapGestureRecognizer ruft Ihre Funktion auf, wenn er einen Fingertipp erhält, und Sie können die Tastatur auf diese Weise schließen:
-(void)didTapAnywhere: (UITapGestureRecognizer*) recognizer { [textField resignFirstResponder]; }
Das Schöne an dieser Lösung ist, dass sie nur nach Antippen und nicht nach Streichen filtert. Wenn Sie also einen scrollenden Inhalt über der Tastatur haben, wird beim Streichen immer noch gescrollt und die Tastatur bleibt angezeigt. Durch das Entfernen des Gestenerkenners, nachdem die Tastatur verschwunden ist, werden zukünftige Taps auf Ihrer Ansicht normal behandelt.
Dies ist eine Lösung, damit die Tastatur beim Drücken verschwindet return
において jede Textfeld, indem Sie Code an einer Stelle hinzufügen (Sie müssen also nicht für jedes Textfeld einen Handler hinzufügen):
betrachten Sie dieses Szenario:
Ich habe eine viewcontroller
mit zwei Textfeldern (Nutzername und Passwort). und die viewcontroller
implementiert UITextFieldDelegate
Protokoll
Ich tue dies in viewDidLoad
- (void)viewDidLoad
{
[super viewDidLoad];
username.delegate = self;
password.delegate = self;
}
und der Viewcontroller implementiert die optionale Methode als
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
und unabhängig davon, in welchem Textfeld Sie sich befinden, sobald ich auf return
in der Tastatur, wird sie abgewiesen!
In Ihrem Fall würde dasselbe funktionieren, solange Sie alle Delegaten des Textfelds auf self setzen und die textFieldShouldReturn
- See previous answers
- Weitere Antworten anzeigen