UITableView didSelectRowAtIndexPath: Wird beim ersten Tippen nicht aufgerufen

352

Ich habe ein Problem mit UITableView's didSelectRowAtIndexPath.

Meine Tabelle ist so eingerichtet, dass bei Auswahl der Zeile ein neuer Ansichts-Controller initialisiert und verschoben wird.

Wenn ich zum ersten Mal auf eine Zeile in der Tabelle tippe, wird die Methode nicht aufgerufen. Sobald ich eine andere Zeile ausgewählt habe, funktioniert sie wie gewohnt.

Ich habe dies durch Setzen eines Haltepunkts überprüft didSelectRowAtIndexPath. Beim Hinzufügen eines NSLogzu der Methode wird angezeigt, dass bei Auswahl der zweiten Zeile, in der der neue Ansichtscontroller endgültig verschoben wird, zwei Protokollanweisungen gleichzeitig in der Konsole angezeigt werden.

Irgendwelche Vorschläge?

Mark Adams
quelle
2
Können Sie Ihren Code für posten tableView:didSelectRowAtIndexPath:?
Gerry3
Ich hatte das gleiche Problem, überprüfen Sie meine Antwort: stackoverflow.com/a/44097559/1600061
Zsivics Sanel
1
Versand in der Hauptwarteschlange löste mein Problem stackoverflow.com/questions/20149167/…
durgeshtrivedi

Antworten:

1356

Hat De selectRowAtIndexPath möglicherweise versehentlich eingegeben ?

Ole Begemann
quelle
17
@Dschee wird beim ersten Tippen nicht aufgerufen, weil Sie nichts abwählen. Sobald Sie eine Zeile ausgewählt haben und versuchen, eine zweite auszuwählen, wird die erste abgewählt.
Der Typ
19
Deshalb liebe ich so.
Elbuild
4
Ich habe dies nicht positiv bewertet, weil ich diesen Fehler einmal gemacht habe. Ich habe positiv gestimmt, weil ich diesen Fehler in genau so vielen Jahren nicht weniger als viermal gemacht habe und so viel Zeit gekostet habe.
Brooks Hanes
8
OH MEIN GOTT!! Dies könnte der schlimmste Fehler sein, den ich in meinem Code eingeführt habe.
Shantanu Paul
4
BEEINDRUCKEND. Hat mir so viel Zeit gespart.
MortalMan
24

Überprüfen Sie auch die Auswahleigenschaft Ihrer Tabellenansicht in der XIB-Datei. Verwenden Sie je nach Bedarf "Einzelauswahl" oder "Mehrfachauswahl".

includeMe
quelle
2
Ba ha ha ha! Wow, ich habe 4 Stunden damit verbracht, das herauszufinden. @includeMe zur Rettung (Gruß)! Vielen Dank!
17

Ich habe folgendes Problem festgestellt:

  • Tippen Sie zuerst in die Reihe -> kein Effekt, keine Auswahl, niemals
  • zweiter Hahn und folgende -> richtige Auswahl Verhalten, immer

In meinem Fall war mein Fehler das Einchecken Show Selection on Touchin Interface Builder. Sie können es in IB hier deaktivieren:

Geben Sie hier die Bildbeschreibung ein

Hoffe das hilft jemandem

sonxurxo
quelle
Sie sind mein Held! Irgendeine Idee, warum dies die Standardeinstellung ist? Ich kann mir keine App vorstellen, die dieses Verhalten aufweist, und ich denke, dies ist eine sehr seltsame Standardeinstellung.
Christophe Fondacci
12

Überprüfen Sie, ob Sie in Ihrer Klasse Gestenerkenner festgelegt haben. Das Entfernen der Geste hat bei mir funktioniert.

YSR-Fan
quelle
Ich habe beides; Gestenerkennung und didSelectRowAtIndexPath? Der Gestenerkenner bevorzugt jedoch immer. Kann nicht zum zweiten gelangen. Gibt es eine Möglichkeit, mit beiden umzugehen, oder muss ich den Gestenerkenner entfernen? Vielen Dank!
Ron
Das muss oben sein :) Es hat mich 1 Stunde nach 7 Jahren in der iOS-Entwicklung gekostet.
Clown
6

Ich habe sogar darüber diskutiert, diese Antwort zu veröffentlichen, weil ich denke, dass die Sterne irgendwie ausgerichtet sind, damit sich dies manifestiert.

Ich habe eine Variation dieses Problems und habe die anderen Lösungen überprüft. In meiner Tabellenansicht verarbeitet es nicht die allerletzte Zeile meiner Tabelle beim ersten Tippen. Es hebt es hervor, wird aber didSelectRowAtIndexPathnicht aufgerufen. Alle anderen Zeilen funktionieren einwandfrei. Aber wenn ich den Tableview-Bounce einschalte, scheint es das Problem zu lösen (aber dann muss man sich mit einem Tableview-Bounce befassen).

Chase Roberts
quelle
Haben Sie den Grund gefunden, warum dies geschieht? Ich habe genau das gleiche Problem. Wenn ich das Abprallen von Tabellen ausschalte, reagiert die erste / letzte Zeile in der Tabelle beim ersten Tippen nicht. Ich dachte, es ist ein Fehler, aber es ist über ein Jahr und es passiert immer noch.
filip.karas
Nein. Ich habe gerade die Tischansicht aktiviert und dabei belassen.
Chase Roberts
Ich habe dieses Problem nur auf einem iPhone 5 (iOS 10.3) - das Einschalten von Bounce in meiner Tabellenansicht hat es behoben. Sehr komisch!
Lee Probert
4

UITableViewCellSelectionStyleNone wurde für die Zelle festgelegt, in der dieses Problem angezeigt wird (ios9).

Ich habe angerufen

[tableView deselectRowAtIndexPath:indexPath animated:NO];

als erstes in

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

Das ist nicht dasselbe, aber gut genug. Ich frage mich, welche Art von Tischbruch ios10 bringt.

Anton Tropashko
quelle
Dies hat bei mir funktioniert, aber ich brauche eine Problemumgehung, um die Auswahl auszublenden, ohne ihren Stil zu ändern. Ich habe überschrieben, setSelectedaber während der Benutzer die Zelle hält, erscheint die Auswahl, die nicht akzeptabel ist
MMujtabaRoohani
1

SWIFT 2

Stellen Sie sicher, dass Sie diesen Wert auf true gesetzt haben:

self.tableView.allowsSelection = true

Setzen Sie dies über Ihr Recht nach Ihrem viewDidLoad()und vor demsuper.viewDidLoad()

Lukesivi
quelle
1

SWIFT 3

Wenn Sie mit Swift 3 in einer Klasse arbeiten, die keine ist UITableViewControllerund die Sie verwenden UITableViewDelegate, müssen Sie möglicherweise den Methodentitel verwenden:

@objc(tableView:didSelectRowAtIndexPath:) func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){...}

Dies hat bei mir funktioniert, obwohl ich gerade mein Projekt auf Swift 3 migriert habe. Es ist ziemlich neu, sodass dies möglicherweise später behoben wird.

Adam Smith
quelle
1

Wenn Sie in Ihrer Klasse einen UITapGestureRecognizer festgelegt haben, können Sie diese Zeile in Ihrem didSelectRowAtIndexPath hinzufügen:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

Das hat bei mir funktioniert.

Garridozh
quelle
1

Dieses Problem tritt auch auf, wenn Sie mit dem Gestenerkenner in einer Tabellenansicht arbeiten. In diesem Fall müssen Sie diese nicht entfernen. Sie müssen lediglich sicherstellen, dass Ihre Gesteneigenschaft cancelsTouchesInView = falseein boolescher Wert ist, der sich darauf auswirkt, ob Berührungen an eine Ansicht geliefert werden, wenn Eine Geste wird erkannt.

Ayoub Nouri
quelle
0

SWIFT 3

Keine der anderen Antworten funktionierte in meinem Fall. Was für mich behoben wurde, war:

tableView.delaysContentTouches = false

Diogo Martins
quelle
0

didSelectRowAtFunktion wurde in meiner App beim ersten oder zweiten Tippen nicht aufgerufen ... Ich habe versucht, das Problem zu lösen, konnte keine Lösung finden. Aber plötzlich wurde mir klar, dass ich view.animation color change ... verwendete. Die DelegateMethode wurde nicht aufgerufen, solange die Animation bestehen blieb

Beyaz
quelle
0

In meinem Fall hatte ich einen UITableView-Abschnittsheader mit einer Gestenerkennung. Wenn Sie auf die Kopfzeile tippen, sollten Sie einige Zeilen in diesen Abschnitt einfügen und die Einfügung animieren (z. B. Abschnitt erweitern / reduzieren). Beim ersten Erweitern und Tippen wurde die didSelectRow-Delegatenmethode nicht ausgelöst. Für weitere Abgriffe und Erweiterungs- / Reduzierungsaktionen funktionierte es wie erwartet.

Per Antwort von @Ayoub Nouri habe ich cancelsTouchesInView auf false gesetzt, wodurch das Problem behoben wurde. tapGestureRecognizer? .cancelsTouchesInView = false

Kabeer
quelle
0

Swift 4.2

Durch Deaktivieren von "Verzögerung beim Aufsetzen" im Attributinspektor wurde das Problem behoben.
Danach sind die Klicks glatt und didSelectRowAt wird sofort ausgelöst.

Inspektor für XCode-Attribute

Aviv Mor
quelle
0

Was für mich funktionierte, war, "didSelect ..." einzugeben und dann den Rest durch Autokorrektur ausfüllen zu lassen. Anscheinend war ein Detail meiner Syntax wackelig. Wie andere gesagt haben, benutze die IDE !!

Safari gelb
quelle