Ich schreibe eine iOS-App mit einer Tabellenansicht in einer Registerkartenansicht. In meinem habe UITableViewController
ich implementiert -tableView:didSelectRowAtIndexPath:
, aber wenn ich zur Laufzeit eine Zeile auswähle, wird die Methode nicht aufgerufen. Die Tabellenansicht wird jedoch gefüllt, sodass ich weiß, dass andere tableView-Methoden in meinem Controller aufgerufen werden.
Hat jemand irgendwelche Ideen, was ich vermasselt habe, um dies zu ermöglichen?
ios
uitableview
cocoa-touch
didselectrowatindexpath
Matt Pfefferle
quelle
quelle
UITableView
?-didSelectRowAtIndexPath
. Ich habe es herausgefunden, weil ich eine Tippgestenerkennung in der Tabellenansicht habe und die Geste zuerst fehlschlagen muss, bevor ich die Berührung erhalte. Obwohl es seltsam ist, wird die Tabellenauswahlanimation vom Gestenerkenner nicht beeinflusst.Antworten:
Es hört sich so an, als ob die Klasse nicht
UITableViewDelegate
für diese Tabellenansicht geeignet ist, obwohl diesUITableViewController
automatisch festgelegt werden soll.Gibt es eine Chance, dass Sie den Delegierten auf eine andere Klasse zurücksetzen?
quelle
Nur für den Fall, dass jemand den gleichen dummen Fehler gemacht hat wie ich:
Überprüfen Sie, ob der Methodenname dessen, was Sie erwarten,
didSelect
versehentlichdidDeselect
auf irgendeine Weise abgerufen werden kann. Es dauerte ungefähr zwei Stunden, bis ich es herausgefunden hatte ...quelle
Eine andere Sache, die zu dem Problem führen könnte, ist nicht ausgewählte Auswahlart:
Sollte
Single Selection
für die normale Auswahl sein, sollte nicht seinNo Selection
.Um dies programmgesteuert zu tun, gehen Sie wie folgt vor:
quelle
Eine andere Möglichkeit besteht darin, dass ein UITapGestureRecognizer die Ereignisse frisst, wie dies hier der Fall war: https://stackoverflow.com/a/9248827/214070
Ich habe diese Ursache nicht vermutet, da die Tabellenzellen immer noch blau hervorheben würden, als würden die Wasserhähne durchkommen.
quelle
didSelectRowAtIndexPath
funktioniert das erst nach dem Löschen der Zelle incommitEditingStyle
. Dann mache ichUITapGestureRecognizer
und intapAction:
kamindexPath
vonsender.view
([self.tableView indexPathForCell:sender.view]
) und rufe an[self.tableView.delegate didSelectRowAtIndexPath:myIndexPath]
Alles gute Antworten, aber es gibt noch eine, auf die Sie achten müssen ...
(Insbesondere beim programmgesteuerten Erstellen einer UITableView)
Stellen Sie sicher, dass tableView auf die Auswahl reagieren kann,
[tableView setAllowsSelection:YES];
indem Sie eine Zeile festlegen oder entfernen, auf die sie festgelegt istNO
.quelle
setAllowsSelectionDuringEditing:
der Liste hinzufügen (wenn sich die Tabellenansicht im Bearbeitungsmodus befindet)Single Selection
.Wenn das Problem mit
UITapGestureRecognizer
Ihnen auftritt, können Sie dies beheben:im Code mit
Objective-C
:im Code mit
Swift
:quelle
Ich bin in diesen Situationen auf zwei Dinge gestoßen.
Möglicherweise haben Sie vergessen, das UITableViewDelegate-Protokoll zu implementieren, oder es gibt keinen Delegierungsausgang zwischen Ihrer Klasse und Ihrer Tabellenansicht.
Möglicherweise befindet sich in Ihrer Zeile eine UIView, die als Ersthelfer fungiert und Ihre Klicks entfernt. Sagen Sie einen UIButton oder ähnliches.
quelle
Ich hatte das gleiche Problem. Und es war schwer zu finden. Aber irgendwo in meinem Code war dies:
Es muss sein
return indexPath
, sonst-tableView:didSelectRowAtIndexPath:
wird nicht gerufen.quelle
Wenn Sie über UITableView einen gestureRecognizer hinzugefügt haben,
didSelectRowAtIndexPath
wird dieser nicht aufgerufen.Sie müssen daher die delegate-Methode gestureRecognizer verwenden, um Berührungen in bestimmten Ansichten zu vermeiden.
quelle
if ([touch.view isDescendantOfView:YourTable])
Ich bin auf ein Problem gestoßen, bei dem ich nach Monaten, in denen ich meinen Code nicht angesehen habe, vergessen habe, dass ich die folgende Methode implementiert habe, da einige Anforderungen nicht erforderlich waren
Für eine Zeile sollte JA zurückgegeben werden, damit sie ausgewählt wird.
quelle
SIE MÜSSEN diese Optionen auswählen
Wenn Sie
UITableView
jedoch beim Klicken nicht hervorheben möchten, sollten Sie Änderungen an denUITableViewCell
Eigenschaften vornehmen .Wählen Sie die Option Keine für die Auswahl wie unten
quelle
Ich hatte eine
UITapGestureRecognizer
auf meine Tischansicht gestellt, um die Tastatur zu schließen, die einen Anruf verhindertedidSelectRowAtIndexPath:
. Hoffe es hilft jemandem.quelle
Falls Sie das gleiche Problem wie ich haben: Anscheinend wird diese Methode nicht aufgerufen, wenn sich Ihre tableView im Bearbeitungsmodus befindet. Sie müssen allowSelectionDuringEditing auf true setzen.
Über diese Frage: Beim Bearbeiten ruft `UITableView` didSelectRowAtIndexPath ?? nicht auf?
quelle
Ich hatte das gleiche Problem,
Der Grund war die Verwendung von
UITapGestureRecognizer
. Ich wollte, dass die Tastatur geschlossen wird, wenn ich irgendwo anders tippe. Mir wurde klar, dass dies alle Tap-Aktionen überschreibt, weshalb diedidSelectRowAtIndexPath
Funktion nicht aufgerufen wurde.Wenn ich die zugehörigen Zeilen kommentiere
UITapGestureRecognizer
, funktioniert es. Außerdem können Sie überprüfen,UITapGestureRecognizer selector
ob das Abhören erfolgtUITableViewCell
oder nicht.quelle
In meinem Fall ist didSelctRowAtIndexPath nicht aufrufend darauf zurückzuführen, dass ich in der Selection- Eigenschaft von tableView keine ausgewählt habe. Die Einstellung auf einzelne Auswahl hat mein Problem gelöst
quelle
Für Xcode 6.4 Swift 1.2. Die Auswahl "Tag" wurde in IB geändert. Ich weiß nicht wie und warum. Durch Einstellen auf "Einzelauswahl" konnten meine Tabellenansichtszellen wieder ausgewählt werden.
quelle
Obwohl eine andere Antwort akzeptiert wurde, werde ich ein weiteres mögliches Problem und eine mögliche Lösung für Personen hinzufügen, die dieses Problem beobachten:
Wenn Sie die automatische Referenzzählung (ARC) aktiviert haben, werden Sie möglicherweise feststellen, dass die Nachrichten der Ansicht an die Steuerung auch nach dem Zuweisen Ihres Controllers als Delegat der Ansicht nicht empfangen werden, da ARC die Steuerung löscht. Anscheinend zählt der Delegatenzeiger von UITableView nicht als Referenz für den ARC. Wenn dies also der einzige Verweis darauf ist, wird der Controller freigegeben. Sie können überprüfen, ob dies geschieht, indem Sie die Dealloc-Methode auf dem Controller implementieren und dort einen Haltepunkt oder einen NSLog-Aufruf festlegen.
Die Lösung besteht darin, den Controller mit einer starken Referenz an einer anderen Stelle zu verfolgen, bis Sie sicher sind, dass Sie ihn nicht mehr benötigen.
quelle
Denken Sie daran, die Datenquelle festzulegen und in der viewDidLoad-Methode wie folgt zu delegieren:
quelle
Mein Problem war keines der oben genannten. Und so lahm. Aber ich dachte, ich würde es hier auflisten, falls es jemandem hilft.
Ich habe einen
tableViewController
, der mein "Basis" -Controller ist, und dann erstelle ich Unterklassen dieses Controllers. Ich habe meinen gesamten Code in dertableView:didSelectRowAtIndexPath
Routine in der "Basis" -Klasse geschrieben. Ganz zu vergessen, dass diese Routine standardmäßig auch in allen meinen Unterklassen erstellt wurde (allerdings ohne Code, der irgendetwas bewirkt hat). Als ich meine App ausführte, wurde die Unterklassenversion des Codes ausgeführt, nichts unternommen und ich wurde traurig. Nachdem ich die Routine aus den Unterklassen entfernt hatte, verwendete sie natürlich die Routine der mt-Basisklasse und ich bin im Geschäft.Ich kenne. Lache nicht. Aber vielleicht spart das jemandem die Stunde, die ich verloren habe ...
quelle
Ich gebe meine 2 Cent dafür.
Ich hatte eine benutzerdefinierte UITableViewCell und es gab eine Schaltfläche, die die gesamte Zelle abdeckte. Als die Berührung erfolgte, wurde die Schaltfläche ausgewählt und nicht die Zelle.
Entfernen Sie entweder die Schaltfläche, oder in meinem Fall setze ich User Interation Enable auf der Schaltfläche auf false. Auf diese Weise wurde die Zelle ausgewählt.
quelle
Wenn Sie dies lesen, löst sich das Problem immer noch nicht.
Ich habe eine benutzerdefinierte Zelle, in der das Kontrollkästchen " Benutzerinteraktion aktiviert " deaktiviert war. Also schalte ich es einfach ein. Viel Glück.
quelle
Ich hatte das gerade und wie mir in der Vergangenheit passiert ist, hat es nicht funktioniert, weil ich beim Hinzufügen der Methode nicht auf die automatische Vervollständigung geachtet habe und am Ende tatsächlich implementiert habe
tableView:didDeselectRowAtIndexPath
: statttableView:didSelectRowAtIndexPath:
.quelle
Stellen Sie sicher, dass Sie implementiert haben
tableView:didSelectRowAtIndexPath
und nichttableView:didDeSelectRowAtIndexPath
Das hat mich mehr als ein paar Mal erwischt !!
quelle
Ich weiß, ist alt und das Problem wurde behoben, aber ein ähnliches Problem hatte, ich dachte, dass das Problem mit meiner benutzerdefinierten UITableViewCell war, aber die Lösung war völlig anders - ich starte XCode neu :) und funktioniert dann ok! fast wie Windows :)
quelle
Wenn sich Ihre Tabellenansicht im Bearbeitungsmodus befindet (z. B.
[tableView setEditing:YES animated:NO];
), müssen Sie festlegentableView.allowsSelectionDuringEditing = YES;
quelle
Ein weiterer Fehler, den Sie hätten machen können (wie ich): Wenn Sie in der Zelle einen Übergang festlegen,
didSelectRowAtIndexPath
wird dieser nicht aufgerufen. Sie sollten Ihre Segmente stattdessen am View Controller einstellen.quelle
Keine dieser Antworten hat bei mir funktioniert. Nach ungefähr einer Stunde fand ich etwas sehr heimtückisches heraus:
Ich habe eine Tabellenansicht in einer Zelle einer anderen Tabellenansicht. Ich habe mich für eine umschließende Ansicht entschieden, die unter anderem die innere Tabellenansicht enthält. Ich habe diese Ansicht contentView aufgerufen und sie in die xib eingebunden.
Es stellt sich heraus, dass UITableViewCell bereits eine contentView hat und seltsame Dinge damit macht. Das Problem wurde von selbst behoben, als ich die Eigenschaft in mainContentView umbenannte und die Ansicht wieder mit dieser umbenannten Eigenschaft verband.
quelle
In meinem Fall berechne ich dynamisch die Höhe des
TableView
‚sSuperView
zur Ladezeit. Aufgrund einer Fehleinschätzung wurde derTableView
außerhalb des positioniertSuperView
. DasTableView
wurde gut gezeichnet, jedoch war jede Interaktion deaktiviert (unddidSelectRowAtIndexPath
wurde nie aufgerufen). Sehr schwer zu erkennen, da es keinen visuellen Hinweis darauf gibt, dass derTableView
nicht "zugänglich" ist.quelle
In meinem Fall war das Problem, dass ich eine
UITableViewCell
Unterklasse hatte und diese beiden Methoden implementiert hatte:touchesBegan:withEvent:
&touchesEnded:withEvent
um eine ausgefallene Animation bei Berührung zu handhaben. Aber ich hatte vergessen, die[super touchesBegan:touches withEvent:event];
Methodenanzeige hinzuzufügen[super touchesEnded:touches withEvent:event];
um auch die Eltern der Zelle über die Berührung zu informieren.Das Ändern des Codes in Folgendes löste mein Problem:
quelle
In meinem Fall bestand die Lösung darin, in der folgenden Funktion NEIN in JA zu ändern.
iOS 9+
quelle