Ich habe meine eigene Funktion geschrieben, um Textfelder nach oben zu scrollen, wenn die Tastatur angezeigt wird. Um die Tastatur durch Tippen auf das Textfeld zu schließen, habe ich eine erstellt UITapGestureRecognizer
, die dafür sorgt, dass der Ersthelfer beim Tippen auf das Textfeld zurücktritt.
Jetzt habe ich auch eine automatische Vervollständigung für das Textfeld erstellt, die UITableView
direkt unter dem Textfeld erstellt und mit Elementen gefüllt wird, wenn der Benutzer Text eingibt.
Wenn Sie jedoch einen der Einträge in der automatisch vervollständigten Tabelle auswählen, didSelectRowAtIndexPath
wird dieser nicht aufgerufen. Stattdessen scheint es, dass der Tippgestenerkenner aufgerufen wird und nur den Ersthelfer zurücktritt.
Ich vermute, es gibt eine Möglichkeit, dem Tap-Gestenerkenner zu sagen, dass er die Tap-Nachricht weiter an den weiterleiten soll UITableView
, aber ich kann nicht herausfinden, was es ist. Jede Hilfe wäre sehr dankbar.
Antworten:
Ok, endlich gefunden nach einigem Durchsuchen der Gestenerkennungsdokumente.
Die Lösung bestand darin
UIGestureRecognizerDelegate
, Folgendes zu implementieren und hinzuzufügen:Das hat sich darum gekümmert. Hoffentlich hilft das auch anderen.
quelle
return ![touch.view isKindOfClass:[UITableViewCell class]];
![touch.view isEqual: self.tableView] &&
vor dem hinzugefügt[touch.view isDescendantOfView: self.tableView]
, um das Selbst auszuschließentableView
(daisDescendantOfView:
auch zurückgegeben wird,YES
wenn die Argumentansicht die Empfängeransicht selbst ist). Hoffe, das hilft anderen Menschen, die das gleiche Ergebnis wollen.Der einfachste Weg, um dieses Problem zu lösen, ist:
Dadurch kann der
UIGestureRecognizer
Benutzer das Tippen erkennen und die Berührung auch an den nächsten Antwortenden weitergeben. Eine unbeabsichtigte Folge dieser Methode ist, wenn Sie einenUITableViewCell
Bildschirm haben, der einen anderen Ansichts-Controller drückt. Wenn der Benutzer auf die Zeile tippt, um die Tastatur zu schließen, werden sowohl die Tastatur als auch der Druck erkannt. Ich bezweifle, dass Sie dies beabsichtigen, aber diese Methode ist für viele Situationen angemessen.Wenn Sie die Antwort von Robert erweitern und einen Zeiger auf die betreffende Tabellenansicht haben, können Sie die Klasse direkt vergleichen, anstatt sie in eine Zeichenfolge konvertieren zu müssen, und hoffen, dass Apple die Nomenklatur nicht ändert:
Denken Sie daran, dass Sie auch deklarieren müssen
UIGestureRecognizer
, dass ein Delegat mit diesem Code darin enthalten ist.quelle
isDescendantOfView
anstatt nur zu überprüfen, ob dasclass
gleich ist, da Sie möglicherweise auf eine Unteransicht tippen. Kommt darauf an was du brauchst.Setzen Sie
cancelsTouchesInView
Ihren Erkenner auf false. Andernfalls "verbraucht" es die Berührung für sich selbst und gibt sie nicht an die Tabellenansicht weiter. Deshalb findet das Auswahlereignis nie statt.zum Beispiel in
swift
quelle
Und für Swift (basierend auf der Antwort von @Jason):
quelle
Ich habe möglicherweise eine bessere Lösung, um eine Tippgeste über einer Tabellenansicht hinzuzufügen, aber gleichzeitig die Zellenauswahl zuzulassen:
Ich suche nur nach einer Zelle an der Stelle des Bildschirms, auf die der Benutzer tippt. Wenn kein Indexpfad gefunden wird, lasse ich die Geste die Berührung empfangen, andernfalls brich ich sie ab. Bei mir funktioniert es super.
quelle
Ich denke, es ist nicht nötig, Codeblöcke zu schreiben, die einfach
cancelsTouchesInView
auffalse
Ihr Gestenobjekt eingestellt sind. Standardmäßig ist dies der Fall,true
und Sie müssen es nur festlegenfalse
. Wenn Sie einUITapGesture
Objekt in Ihrem Code verwenden und auchUIScrollView
(Tabellenansicht, Sammlungsansicht) verwenden, legen Sie diese Eigenschaft festfalse
quelle
Eine ähnliche Lösung ist die Implementierung
gestureRecognizer:shouldReceiveTouch:
mithilfe der Klasse der Ansicht , um zu bestimmen, welche Aktion ausgeführt werden soll. Dieser Ansatz hat den Vorteil, dass Abgriffe in dem Bereich, der die Tabelle direkt umgibt, nicht maskiert werden (die Ansichten dieses Bereichs stammen immer noch von den UITableView-Instanzen ab, stellen jedoch keine Zellen dar).Dies hat auch den Vorteil, dass es mit mehreren Tabellen in einer einzigen Ansicht funktioniert (ohne zusätzlichen Code hinzuzufügen).
Vorsichtsmaßnahme: Es wird davon ausgegangen, dass Apple den Klassennamen nicht ändert.
quelle
return ![[touch.view.superview class] isSubclassOfClass:[UITableViewCell class]];
Für Swift 4.2 bestand die Lösung darin
UIGestureRecognizerDelegate
, Folgendes zu implementieren und hinzuzufügen:Wenn Sie auf Tabellenansicht klicken, gibt diese Delegatenmethode false zurück und die
didSelectRowAtIndexPath
Methode der Tabellenansicht funktioniert ordnungsgemäß.quelle
Ich hatte eine andere Situation, in der ich wollte, dass die Touch-Gestenfunktion nur aufgerufen wird , wenn der Benutzer außerhalb der Tabellenansicht tippt. Wenn der Benutzer in die Tabellenansicht getippt hat, sollte die Touch-Gestenfunktion nicht aufgerufen werden. Wenn die Touch-Gestenfunktion aufgerufen wird, sollte das Touch-Ereignis weiterhin an die Ansicht übergeben werden, auf die getippt wurde, anstatt es zu verbrauchen.
Der resultierende Code ist eine Kombination aus Abdulrahman Masouds Antwort und Nikolaj Nielsens Antwort.
Und in der
MyViewController
Klasse, die die Klasse hat dieUITableView
, in deronViewDidLoad()
, stellte ich sicher , zu nennenaddGestureRecognizer()
:quelle
Stellen Sie einfach
cancels touches in view
auffalse
für jede Geste unter der(table/collection)View
:- Interfacebuilder
- Code
quelle
Obwohl es spät ist und viele Leute feststellen, dass die oben genannten Vorschläge gut funktionieren, konnte ich Jasons oder TMilligans Methoden nicht zum Laufen bringen.
Ich habe eine statische Tabellenansicht mit mehreren Zellen, die textFields enthalten, die Zahleneingaben nur über die Zifferntastatur empfangen. Das war ideal für mich:
Stellen Sie sicher, dass Sie dies
<UIGestureRecognizerDelegate>
in Ihrer .h-Datei implementiert haben .Diese Zeile
![touch.view isKindOfClass:[UITableViewCell class]]
prüft, ob auf eine tableViewCell getippt wurde, und schließt eine aktive Tastatur aus.quelle
Eine einfache Lösung besteht darin, UIControl-Instanzen in UITableViewCell zu verwenden, um Berührungen zu erhalten. Sie können UIControl beliebige Ansichten mit userInteractionEnables == NO hinzufügen, um Abgriffe abzurufen.
quelle
Hier ist meine Lösung, die das shouldReceiveTouch des Erkenners direkt damit verknüpft, ob die Tastatur angezeigt wird.
In Ihrem Tap-Gestenerkennungs-Delegaten:
Und die
PFXKeyboardStateListener.h
:Und die
PFXKeyboardStateListener.m
:Möglicherweise möchten Sie das Singleton-Muster des Tastatur-Listeners aktualisieren. Ich bin noch nicht dazu gekommen. Hoffe, das funktioniert für alle anderen genauso wie für mich. ^^
quelle
Implementieren Sie diese Methode für den Delegaten von UIGestureRecognizer:
quelle
In Kürze können Sie dies im Inneren verwenden
quelle
Mein Fall war anders, einschließlich einer Suchleiste und einer geeigneten Ansicht auf self.view. Ich wollte die Tastatur der Suchleiste durch Berühren der Ansicht schließen.
Zu UISearchBar-Delegatmethoden:
Wenn der Benutzer self.view berührt:
quelle
Swift 5, Mai 2020.
Ich habe ein Textfeld und eine Tabellenansicht, die sichtbar werden, wenn ich Text eingebe.
Ausgangszustand Ich möchte also zwei verschiedene Ereignisse, wenn ich auf tableViewCell oder etwas anderes tippe.
Tastatur und tableView werden angezeigt
Zuerst fügen wir tapGestureRecognizer hinzu.
Anschließend fügen wir UIGestureRecognizerDelegate den folgenden Check hinzu:
}}
Wenn ich zuerst die Tastatur ausblenden möchte, bleibt die tableView sichtbar und reagiert auf meine Berührungen.
Geben Sie hier die Bildbeschreibung ein
quelle
Dies ist meine Lösung basierend auf den obigen Antworten ... Es hat für mich funktioniert ...
quelle
PROBLEM: In meinem Fall bestand das Problem darin, dass ich ursprünglich eine Schaltfläche in jede collectionView-Zelle eingefügt und die Einschränkungen zum Füllen der Zelle festgelegt habe, sodass beim Klicken auf die Zelle auf die Schaltfläche geklickt wurde, die Schaltflächenfunktion jedoch leer war und nichts vorhanden war scheinbar passiert.
UPDATE: Ich habe dies behoben, indem ich die Schaltfläche aus der Zelle der Sammlungsansicht entfernt habe.
quelle