ios - -didSelectRowAtIndexPath:wird nicht aufgerufen




uitableview cocoa-touch (25)

Ich schreibe eine iOS-App mit einer Tabellenansicht innerhalb einer Registerkartenansicht. In meinem UITableViewController ich -tableView:didSelectRowAtIndexPath: implementiert -tableView:didSelectRowAtIndexPath: aber wenn ich eine Zeile zur Laufzeit auswähle, wird die Methode nicht aufgerufen. Die Tabellenansicht wird jedoch gefüllt, daher weiß ich, dass andere TableView-Methoden in meinem Controller aufgerufen werden.

Hat jemand irgendwelche Ideen, was ich vielleicht vermasselt habe, um dies zu erreichen?


Answers

Es klingt, als ob die Klasse nicht das UITableViewDelegate für diese Tabellenansicht ist, obwohl UITableViewController das automatisch UITableViewController soll.

Gibt es eine Chance, dass Sie den Delegaten auf eine andere Klasse zurücksetzen?


Denken Sie daran, die Datenquelle und den Delegaten in der viewDidLoad-Methode wie folgt festzulegen:

[self.tableView setDelegate:self];

[self.tableView setDataSource:self];

Ich habe in diesen Situationen zwei Dinge erlebt.

  1. Möglicherweise haben Sie vergessen, das UITableViewDelegate-Protokoll zu implementieren, oder es gibt keine Delegierungsstelle zwischen Ihrer Klasse und Ihrer Tabellenansicht.

  2. Möglicherweise haben Sie eine UIView in Ihrer Zeile, die ein Ersthelfer ist und Ihre Klicks entfernt. Sag ein UIButton oder etwas Ähnliches.


Ich weiß, ist alt und das Problem wurde gelöst, aber ein ähnliches Problem hatte, dachte ich, dass das Problem mit meiner benutzerdefinierten UITableViewCell war, aber die Lösung war völlig anders - ich starte XCode :) und funktioniert dann ok! fast wie Windows :)


Wenn das Problem mit UITapGestureRecognizer auftritt, können Sie Folgendes beheben:

  • im Storyboard:

  • im Code mit Objective-C:

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; 
    [self.view addGestureRecognizer:tap];
    
    [tap setCancelsTouchesInView:NO];
    
  • im Code mit Swift:

    let tap = UITapGestureRecognizer(target: self, action:Selector("dismissKeyboard"))
    view.addGestureRecognizer(tap)
    
    tap.cancelsTouchesInView = false
    

Eine andere Sache, die zu dem Problem führen könnte, ist nicht die ausgewählte Auswahlart:

Sollte Single Selection für normale Auswahl sein, sollte keine No Selection .


In meinem Fall berechne ich dynamisch die Höhe des TableView SuperView zur Ladezeit. Aufgrund einer Fehlkalkulation wurde das TableView außerhalb des SuperView . Die TableView wurde gut gezeichnet, aber alle Interaktion wurde deaktiviert (und didSelectRowAtIndexPath wurde nie aufgerufen). Sehr schwer zu erkennen, da kein visueller Hinweis darauf TableView , dass das TableView nicht "erreichbar" ist.


Ich gebe meine 2 Cent dazu.

Ich hatte eine benutzerdefinierte UITableViewCell und es gab eine Schaltfläche, die die gesamte Zelle abdeckte. Wenn die Berührung stattfand, wurde die Schaltfläche ausgewählt und nicht die Zelle.

Entweder entferne den Knopf oder in meinem Fall setze ich User Interation Enable auf false auf der Schaltfläche, so dass die Zelle ausgewählt wurde.


Achten Sie auf die UITableView-Eigenschaften im Storyboard. In meinem Fall wurde die Combox im Storyboard als "Auswahl: Einzelauswahl" ausgewählt, wodurch die Methode didSelectRowAtIndexPath nicht ausgeführt werden kann.


Alle guten Antworten, aber es gibt noch einen zu beachten ...

(Insbesondere beim programmgesteuerten Erstellen eines UITableView)

Stellen Sie sicher, dass das TableView auf die Auswahl reagieren kann, indem Sie [tableView setAllowsSelection:YES]; oder entfernen Sie eine Zeile, die es auf NO .


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 schrieb meinen gesamten Code in der Routine " tableView:didSelectRowAtIndexPath in der Klasse "base". Ganz zu schweigen davon, dass diese Routine standardmäßig auch in allen meinen Unterklassen erstellt wurde (allerdings ohne Code, der irgendetwas getan hat). Also, als ich meine App lief, lief es die Unterklasse-Version des Codes, tat nichts und machte mich traurig. Sobald ich also die Routine aus den Unterklassen entfernt habe, hat sie die mt "base" Klassenroutine benutzt und ich bin im Geschäft.

Ich kenne. Lach nicht. Aber vielleicht wird das jemandem die Stunde retten, die ich verloren habe ...


Eine andere Möglichkeit ist, dass ein UITapGestureRecognizer die Ereignisse auffressen könnte, wie dies hier der Fall war: https://.com/a/9248827/214070

Ich habe diese Ursache nicht vermutet, weil die Tabellenzellen immer noch blau leuchten würden, als würden die Wasserhähne durchkommen.


Für Xcode 6.4, Swift 1.2. Die Auswahl "tag" wurde in IB geändert. Ich weiß nicht wie und warum. Durch die Einstellung "Einzelauswahl" wurden meine Tabellenansichtszellen wieder auswählbar.


Ich hatte das gleiche Problem. Und es war schwer zu finden. Aber irgendwo in meinem Code war das:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    return nil;
}

Es muss zurückgegeben werden return indexPath , else -tableView:didSelectRowAtIndexPath: wird nicht aufgerufen.


Sie müssen diese Optionen auswählen

Aber wenn Sie möchten, dass uitableview beim Klicken nicht hervorgehoben wird, sollten Sie Änderungen an den Eigenschaften von UITableViewCell vornehmen ... Wählen Sie die Option Keine für die Auswahl ... genau wie ...


In meinem Fall bestand die Lösung darin, in der nachstehenden Funktion NEIN in JA zu ändern.

iOS 9+

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

Ok, update hier, da ich gerade auf dieses Problem stieß, und mein Problem war etwas anders als hier gefunden.

Ich schaute in IB und sah, dass mein Delegat WAS festgelegt wurde, aber es wurde falsch auf VIEW statt File's Owner festgelegt (Rechtsklick auf die Tabellenansicht, um zu sehen, wo Delegat verweist).

Hoffe das hilft jemandem


Ich hatte gerade das und wie mir passiert ist, hat es in der Vergangenheit nicht funktioniert, weil ich nicht auf die Autovervollständigung geachtet habe, als ich versuchte, die Methode hinzuzufügen, und ich tatsächlich tableView:didDeselectRowAtIndexPath implementiere tableView:didDeselectRowAtIndexPath : statt tableView:didSelectRowAtIndexPath: .


Ein weiterer Fehler, den Sie hätten machen können (wie ich es tat): Wenn Sie einen Übergang in der Zelle setzen, wird didSelectRowAtIndexPath nicht aufgerufen. Sie sollten stattdessen Ihre Segmente am View-Controller einstellen.


Ich hatte das gleiche Problem,

Der Grund war die Verwendung von UITapGestureRecognizer . Ich wollte, dass die Tastatur wegfällt, wenn ich irgendwo anders tippte. Ich erkannte, dass dies alle Tap-Aktionen außer Kraft setzt, weshalb die didSelectRowAtIndexPath Funktion nicht aufgerufen wurde.

Wenn ich die mit UITapGestureRecognizer Zeilen UITapGestureRecognizer , funktioniert es. Außerdem können Sie die Funktion des UITapGestureRecognizer selector wenn das UITableViewCell oder nicht.


Dies war wahrscheinlich nur in meinem Fall, aber ich hatte einige Dateien von einem Backup neu geladen und die Dinge haben nicht funktioniert, einschließlich dieser. Nach einer vollständigen Reinigung (Product> Clean oder Shift + Command + K) funktionierte es. Wahrscheinlich wurde in einem vorkompilierten Header etwas kaputt gemacht. Wahrscheinlich ist das nicht das Problem für Sie, aber es ist einen Versuch wert.



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 aufgrund einiger Anforderungen implementiert habe, die nicht notwendig waren

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath  *)indexPath{
    return NO;
}

Es sollte YES für eine Zeile zurückgeben, damit es ausgewählt wird.


Ich hatte einen UITapGestureRecognizer in meiner Tabellenansicht platziert, um die Tastatur, die didSelectRowAtIndexPath: verhindert hat, zu didSelectRowAtIndexPath: . Hoffe es hilft jemandem.


Bei einem "atomaren Schreiben" wird garantiert, dass Sie entweder einen korrekten vollständigen Schreibvorgang in die Datei oder einen Fehler haben. Es besteht keine Chance, dass beispielsweise die Hälfte des Schreibvorgangs funktioniert, und dann passiert etwas Schlechtes (Verlust der Stromversorgung, Laufwerksausfall usw.) und der Rest des Schreibvorgangs schlägt fehl. Alles oder Nichts. Dies ist in der Regel das, was Sie wollen.





ios uitableview cocoa-touch didselectrowatindexpath