Ich habe ein UITableView
mit UITextField
s als Zellen. Ich möchte die Tastatur schließen, wenn der Hintergrund des UITableView
berührt wird. Ich versuche dies zu tun, indem ich eine UIButton
Größe von erschaffe UITableView
und sie hinter die lege UITableView
. Das einzige Problem ist UIButton
, dass alle Berührungen erfasst werden, auch wenn sich die Berührung in der UITableView befindet. Was mache ich falsch?
Vielen Dank!
ios
uitableview
uikeyboard
Hua-Ying
quelle
quelle
Antworten:
Dies ist einfach zu erreichen, indem Sie ein UITapGestureRecognizer- Objekt erstellen (standardmäßig wird eine "Geste" bei einem einzigen Tippen erkannt, sodass keine weitere Anpassung erforderlich ist), ein Ziel / eine Aktion für den Zeitpunkt des Auslösens der Geste angeben und dann das Gestenerkennungsobjekt anhängen zu Ihrer Tabellenansicht.
ZB Vielleicht in Ihrer
viewDidLoad
Methode:Und die
hideKeyboard
Methode könnte so aussehen:Beachten Sie, dass die Geste beim Berühren eines
UITextField
Objekts nicht ausgelöst wird. Es wird jedoch imUITableView
Hintergrund, in der Fußzeile, in der Kopfzeile und inUILabels
inneren Zellen usw. ausgelöst .quelle
gestureRecognizer.cancelsTouchesInView = NO;
hideKeyboard
Methode können Sie nicht direkt mit den Textfeldern kommunizieren[self.view endEditing:NO];
. Aus Apple-Dokumenten: " Diese Methode untersucht die aktuelle Ansicht und ihre Unteransichtshierarchie für das Textfeld, das derzeit der Ersthelfer ist. Wenn es eines findet, fordert es dieses Textfeld auf, als Ersthelfer zurückzutreten. Wenn der Parameter force auf gesetzt ist JA, das Textfeld wird nie gefragt; es muss zurücktreten. "Die UITapGestureRecognizer-Lösung funktioniert mit der Auswahl von Tabellenzellen, wenn Sie Folgendes festlegen:
quelle
shouldReceiveTouch
Hier ist der beste Weg, dies zu tun. Mach das einfach
oder
quelle
Sie können dies auch über das Storyboard tun:
quelle
Wie
UITableView
bei einer Unterklasse vonUIScrollView
bietet die Implementierung einer der folgenden Delegatenmethoden eine äußerst einfache und schnelle Lösung. Sie müssen nicht einmal einbeziehen,resignFirstResponder
da die Ansichtshierarchie introspektiert und den aktuellen Antwortenden findet und ihn auffordert, seinen Antwortstatus zurückzuziehen.Und denken Sie daran,
UIScrollViewDelegate
zur Header-Datei hinzuzufügen .quelle
self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.onDrag
Hören Sie zunächst
scrollViewWillBeginDragging
in IhremUIViewController
nach, indem Sie das hinzufügenUIScrollViewDelegate
:In der .h-Datei:
In der .m-Datei:
Hören Sie dann auf andere Interaktionen:
Dann implementieren Sie
dismissKeyboard
:Und wenn Sie wie ich die Tastatur für ein UITextField in einer benutzerdefinierten Tabellenzelle schließen wollten:
Hoffe das hilft jedem bei der Suche !!
quelle
quelle
Hier ist die schnelle Version für Ihr Codierungsvergnügen:
Es fügt eine Tippgestenerkennung hinzu und schließt dann die Tastatur. Für das TextField ist keine Steckdose erforderlich!
quelle
Es gibt die Swift 3-Version, ohne das Abhören von Zellen zu blockieren.
In
viewDidLoad()
Methode:Und
hideKeyboard
sieht so aus:quelle
Ich habe es so gemacht:
Erstellen Sie in Ihrem TableViewController eine Methode, um den Ersthelfer zu deaktivieren (dies wäre zu diesem Zeitpunkt Ihre TextBox).
In
tableView:didSelectRowAtIndexPath:
Aufruf der vorherigen Methode:quelle
didSelectRowAtIndexPath
wird nicht ausgelöst, wenn Sie auf die TableView selbst tippen.Ich hatte eine
UITableViewController
und die ImplementierungtouchesBegan:withEvent:
hat bei mir nicht funktioniert.Folgendes hat funktioniert:
Schnell:
Ziel c:
quelle
Stellen Sie dann sicher, dass Sie in Ihrer Nib-Datei den Typ Ihrer UITableView auf DismissableUITableView setzen ..... vielleicht hätte ich mir einen besseren Namen für diese Klasse vorstellen können, aber Sie verstehen es.
quelle
Wenn Sie auf iOS7 abzielen, können Sie eine der folgenden Optionen verwenden:
Ersteres animiert die Tastatur außerhalb des Bildschirms, wenn die Tabellenansicht gescrollt wird, und letzteres versteckt die Tastatur wie die Standardnachrichten-App.
Beachten Sie, dass diese von sind
UIScrollView
, die vonUITableView
erben.quelle
Versuche dies:
quelle
UITableView ist eine Unterklasse von UIScrollView.
So wie ich es gemacht habe, habe ich auf ein Scroll-Ereignis des Benutzers gewartet und dann resignFirstResponder. Hier ist die UIScrollViewDelegate-Methode, die Sie in Ihren Code implementieren können.
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
Wenn ich mich solchen Problemen nähere, habe ich festgestellt, dass der beste Weg darin besteht, die Delegatenprotokolle für jedes Objekt und die der übergeordneten Klassen (in diesem Fall UITableViewDelegate, UIScrollViewDelegate) zu untersuchen. Die Anzahl der Ereignisse, die NS-Objekte auslösen, ist ziemlich groß und umfassend Es ist auch einfacher, ein Protokoll zu implementieren, als irgendetwas zu unterklassifizieren.
quelle
Ich hatte das gleiche Problem und hier ist meine Lösung, es funktioniert perfekt für mich:
In der Ansicht oder Ansichtssteuerung, die Sie implementiert haben
<UITextFieldDelegate>
(In meinem Fall habe ich einen Brauch
UITableViewCell
namens TextFieldCell),Deklarieren Sie das
UITapGestureRecognizer
als Eigenschaft:Und initialisieren Sie es in Ihrer Ansicht / Ihrem Controller:
- (void)textFieldDidBeginEditing:(UITextField *)textField
Verwenden SiesuperView
in der Methode, um zu Ihrer tableView zu gelangen und Folgendes aufzurufenaddGestureRecognizer
:Und in der
- (void)textFieldDidEndEditing:(UITextField *)textField
entfernen Sie einfach die Gestenerkennung:Ich hoffe es hilft.
quelle
Ich wollte, dass meine Zelle die Tastatur öffnet, wenn ein Teil der Zelle ausgewählt wurde, und sie schließt, wenn Sie irgendwo außerhalb der Zelle geklickt haben. So öffnen Sie die Tastatur:
(HINWEIS: Ich habe die Zelle in Unterklassen unterteilt, aber Sie können dies problemlos mit der
tableView:didSelectRowAtIndexPath:
Delegate-Methode von erreichenUITableView
)Dies bedeutete, dass bei den Top-Lösungen, wenn Sie zweimal auf die Zelle klickten, die Tastatur zitterte, als erstens der Gestenerkenner versuchte, die Tastatur zu schließen, und zweitens die Zelle erneut ausgewählt und versucht wurde, die Tastatur zu öffnen.
Die Lösung besteht darin, zu überprüfen, ob der Klick in der aktuell ausgewählten Zelle aufgetreten ist:
quelle
Ich habe eine Lösung gefunden, die großartig funktioniert.
Wird benötigt, um UIGestureRecognizerDelegate und die Methode zu verwenden - gestureRecognizer: shouldReceiveTouch: .
Fügen Sie die Gestenerkennung wie folgt zur TableView hinzu:
Implementieren Sie dann die delegierte Methode shouldReceiveTouch , um Berührungen abzulehnen, die in der UITableViewCell-Klasse ausgeführt werden. Die hideKeyboard- Methode wird nur aufgerufen, wenn die Berührung außerhalb der UITableViewCell-Klasse ausgeführt wurde.
quelle
UITableView
hat eine praktischebackgroundView
Eigenschaft, mit der ich dieses Verhalten erreicht habe, ohne die Zellenauswahl zu beeinträchtigen, wie unten in Swift gezeigt:quelle
Ich habe nach der Lösung gesucht und nichts gefunden, das zu meinem Code passt, also habe ich es so gemacht:
http://82517.tumblr.com/post/13189719252/dismiss-keyboard-on-uitableview-non-cell-tap
Es handelt sich im Grunde genommen um eine Kombination der oben genannten Ansätze, es ist jedoch nicht erforderlich, eine Unterklasse zu erstellen oder Hintergrundschaltflächen zu erstellen.
quelle
Die einfache Verwendung eines UITapGestureRecognizers
cancelsTouchesInView = NO
bedeutet, dass durch Tippen auf Zellen und UITextViews auch das Ausblenden ausgelöst wird. Dies ist schlecht, wenn Sie mehrere UITextViews haben und auf die nächste tippen. Die Tastatur beginnt sich auszublenden und dann wird die nächste Textansicht zum ersten Antwortenden und die Tastatur wird wieder sichtbar. Um dies zu vermeiden, überprüfen Sie die Position des Tippen und verbergen Sie die Tastatur nur, wenn sich das Tippen nicht in einer Zelle befindet:Um
scrollViewWillBeginDragging:
ausgelöst zu werden, muss diescrollEnabled
Eigenschaft von tableView seinYES
quelle
Warum möchten Sie eine Tabelle voller Textfelder erstellen? Sie sollten für jede Zeile, die die Textfelder enthält, eine Detailansicht verwenden. Stellen Sie beim Verschieben Ihrer Detailansicht sicher, dass Sie "[myTextField werden zum ersten Antwortgeber]" aufrufen, damit der Benutzer mit nur einem Klick von der Tabellenliste entfernt mit der Bearbeitung beginnen kann.
quelle
Wenn Sie bereit sind, Ihre Tabellenansicht in eine Unterklasse (ugh!) Zu unterteilen, könnte Folgendes funktionieren:
quelle
Wenn Sie die Tastatur schließen möchten, während die Eingabetaste gedrückt wird, können Sie einfach den folgenden Code in textField hinzufügen, falls die Methode zurückgegeben wird:
Einige Textfelder haben möglicherweise eine Auswahlansicht oder eine andere als Unteransicht. In diesem Fall funktioniert die obige Methode nicht. In diesem Fall müssen wir die UITapGestureRecognizer-Klasse verwenden, dh fügen Sie der viewDidLoad-Methode das folgende Codeausschnitt hinzu:
Fügen Sie nun einfach den Resign-Responder zur Auswahlmethode hinzu, dh:
Hoffe es hilft, danke :)
quelle
Viele interessante Antworten. Ich möchte verschiedene Ansätze in die Lösung einbauen, die meiner Meinung nach am besten zu einem UITableView-Szenario passt (es ist das, das ich normalerweise verwende): Normalerweise möchten wir die Tastatur in zwei Szenarien ausblenden: beim Tippen außerhalb der Text-UI-Elemente, oder beim Scrollen nach unten / oben in der UITableView. Das erste Szenario können wir einfach über einen TapGestureRecognizer und das zweite über die UIScrollViewDelegate scrollViewWillBeginDragging: -Methode hinzufügen. Erste Aufgabe, die Methode zum Ausblenden der Tastatur:
Diese Methode gibt alle textField-Benutzeroberflächen der Unteransichten innerhalb der UITableView-Ansichtshierarchie zurück. Daher ist es praktischer, als jedes einzelne Element unabhängig zurückzulegen.
Als nächstes kümmern wir uns um die Entlassung über eine externe Tap-Geste mit:
Wenn Sie tapGestureRecognizer.cancelsTouchesInView auf NO setzen, wird verhindert, dass der gestureRecognizer das normale Innenleben von UITableView überschreibt (z. B. um die Zellenauswahl nicht zu beeinträchtigen).
Um das Ausblenden der Tastatur beim Scrollen nach oben / unten in der UITableView zu handhaben, müssen wir die UIScrollViewDelegate-Protokoll-Methode scrollViewWillBeginDragging: wie folgt implementieren:
.h Datei
.m Datei
Ich hoffe, es hilft! =)
quelle
Hier ist, wie ich endlich funktioniert habe. Ich habe Vorschläge und Codes aus verschiedenen Antworten kombiniert. Funktionen: Schließen der Tastatur, Verschieben von Textfeldern über die Tastatur beim Bearbeiten und Einstellen des Tastaturrückgabetyps "Weiter" und "Fertig". ERSETZEN Sie "..." durch weitere Felder
quelle
Die Antwort von @ mixca ist sehr nützlich, aber was ist, wenn ich etwas anderes als UITextField habe? Ich denke, der beste Weg, um damit umzugehen, indem alle Unteransichten der Hauptansicht mit rekursiver Funktion durchsucht werden, siehe Beispiel unten
Außerdem können Sie diese Methode in Ihre Utility-Klasse einfügen und eine Tippgeste wie die Antwort von @ mixca verwenden.
quelle
Swift 4 / 4.2 / 5
Sie können die Tastatur auch schließen, wenn Sie auf eine Zelle tippen - bevor Sie etwas anderes tun.
quelle
tableView.keyboardDismissMode = .onDrag // .interactive
quelle