Frage

Ich schreibe einen iOS-App mit einer Tabellenansicht in einer Tab-Ansicht. In meinem UITableViewController setzte ich -tableView:didSelectRowAtIndexPath:, aber wenn ich eine Zeile zur Laufzeit wählen, wird die Methode nicht aufgerufen wird. Die Tabellenansicht obwohl bevölkert wird, so dass ich weiß, dass andere Methoden in meinem Tableview Controller aufgerufen werden.

Hat jemand irgendwelche Ideen, was ich oben geschraubt haben, dies zu verwirklichen?

War es hilfreich?

Lösung

Es klingt wie vielleicht die Klasse nicht die UITableViewDelegate für diese Tabelle Ansicht ist, obwohl UITableViewController angenommen wird, dass automatisch eingestellt werden.

Jede Chance, dass Sie die Delegaten in einer anderen Klasse zurücksetzen?

Andere Tipps

Für den Fall, jemand aus dem gleichen dummen Fehler wie ich:

Überprüfen Sie, ob der Methodenname von dem, was Sie zu sein didSelect erwarten zufällig in irgendeiner Weise gotten didDeselect werden kann. Es dauerte etwa zwei Stunden für mich, um herauszufinden, ...

Eine andere Sache, zu der Frage führen könnte, wird nicht ausgewählt Auswahl Art:

UITableView Auswahl Art

Sollte für normale Auswahl Single Selection werden sollte nicht No Selection werden.

Eine andere Möglichkeit ist, dass ein UITapGestureRecognizer die Ereignisse zu essen sein könnte, wie es hier der Fall war: https://stackoverflow.com/a / 9248827/214070

Ich habe nicht diese Ursache vermuten, da die Tabellenzellen noch blau markieren würde, als ob die Hähne durch bekamen.

Alle gute Antworten, aber es gibt noch ein, wo sie nach ...

(insbesondere, wenn ein UITableView programmatisch erstellen)

Stellen Sie sicher, dass die Tableview in die Auswahl, indem [tableView setAllowsSelection:YES]; oder Entfernen jeglicher Linie reagieren kann, dass es NO setzt.

Wenn das Problem mit UITapGestureRecognizer entstehen Sie können dieses Problem beheben:

  • in Storyboard:

eingeben Bild Beschreibung hier

in Code mit Objective-C:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; 
[self.view addGestureRecognizer:tap];

[tap setCancelsTouchesInView:NO];

in Code mit Swift:

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

tap.cancelsTouchesInView = false

Ich habe zwei Dinge in diesen Situationen angetroffen werden.

  1. Sie haben vergessen haben UITableViewDelegate Protokoll, oder es gibt keine Delegation Ausgang zwischen Klasse und Ihre Tabellenansicht.

  2. zu implementieren
  3. Sie können eine UIView in Ihrer Zeile haben, die ein First Responder und nehmen Ihren Klicks entfernt. Sprich einen UIButton oder etwas ähnliches.

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

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

Es muss return indexPath werden, sonst -tableView:didSelectRowAtIndexPath: heißt nicht werden.

Wenn Sie eine GestureRecognizer auf dem UITableView, didSelectRowAtIndexPath hinzugefügt wird nicht aufgerufen.

Sie müssen also GestureRecognizer Delegatmethode verwenden Touch insbesondere Ansicht zu vermeiden.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isDescendantOfView:YourTable]) {
        return NO;
    }
    return YES;
}

Ich habe ein Problem lief, wo nach Monaten nicht an meinem Code suchen Ich habe vergessen, dass ich die folgende Methode aufgrund einiger Anforderungen umgesetzt, die nicht notwendig waren

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

Es sollte ja für eine Zeile, um zurückkehren zu machen, ausgewählt.

Sie müssen diese Optionen auswählen

aber wenn Sie möchten UITableViewnot machen hervorgehoben zu klicken, dann sollten Sie Änderungen in UITableViewCell Eigenschaften machen.

Wählen Sie Keine Option für die Auswahl wie unter

hatte ich einen UITapGestureRecognizer auf meinem Tisch Ansicht legen Sie die Tastatur zu entlassen, die didSelectRowAtIndexPath: verhindert aufgerufen wird. Hoffe, es hilft jemand.

Falls Sie das gleiche Problem wie ich: Anscheinend wird diese Methode nicht aufgerufen werden, wenn Ihr Tableview im Bearbeitungsmodus befindet. Sie haben allowsSelectionDuringEditing auf true zu setzen.

Über diese Frage: Bei der Bearbeitung `UITableView` DidSelectRowAtIndexPath nicht nennen ??

Ich hatte das gleiche Problem,

Der Grund wurde unter Verwendung von UITapGestureRecognizer. Ich wollte die Tastatur zu entlassen, wenn ich irgendwo anders angezapft. Ich erkannte, dass dies alle tap Aktionen Vorrang, weshalb, hat didSelectRowAtIndexPath Funktion nicht aufgerufen.

Wenn ich die Zeilen im Zusammenhang mit UITapGestureRecognizer kommentieren, es funktioniert. Außerdem können Sie in der Funktion der UITapGestureRecognizer selector überprüfen, ob der UITableViewCell ist angezapft oder nicht.

Für Xcode 6.4, Swift 1.2. Die Auswahl „Tag“ war in IB geändert. Ich weiß nicht, wie und warum. Setzen auf „Single Selection“ aus meiner Tisch Ansicht Zellen wählbar wieder. eingeben Bild Beschreibung hier

In meinem Fall didSelctRowAtIndexPath nicht ruft wegen, dass ich ausgewählt habe keine in der Auswahl Eigenschaft Tableview, auf Einzel Auswahl mein Problem gelöst

 image description hier

Auch wenn eine andere Antwort akzeptiert wurde, werde ich ein weiteres mögliches Problem und Lösung für Menschen, die sich diese Ausgabe zu beachten:

Wenn Sie die automatische haben einen Referenzzähler (ARC) eingeschaltet, können Sie feststellen, dass auch der Controller als Delegierter der Ansicht, nach der Zuordnung der Nachrichten Ansicht an den Controller nicht empfangen, weil ARC den Controller zu löschen. Anscheinend ist der Delegat Zeiger des UITableView nicht als Referenzzähler für die ARC, so dass, wenn der einzige Hinweis darauf ist, wird der Controller dealloc'd werden. Sie können überprüfen, ob dies durch geschieht die dealloc Methode auf dem Controller Implementierung und einen Haltepunkt oder NSLog Anruf dort zu setzen.

Die Lösung ist woanders mit einer starken Referenzspur des Controllers zu halten, bis Sie sicher sind, werden Sie es nicht mehr benötigen.

Denken Sie daran, die Datenquelle und delegieren im viewDidLoad Verfahren wie folgt festzulegen:

[self.tableView setDelegate:self];

[self.tableView setDataSource:self];

Mein Problem war keine der oben genannten. Und so lahm. Aber ich dachte, dass ich es hier in Falliste wäre es jemand hilft.

Ich habe eine tableViewController, dass meine „Basis“ Controller ist und dann erzeuge ich Subklassen dieser Controller. Ich schrieb alle meine Code in der tableView:didSelectRowAtIndexPath Routine in der „Basis“ Klasse. Völlig vergessen, dass standardmäßig hatte diese Routine auch (wenn auch ohne Code, der etwas getan) geschaffen als auch in allen meinen Unterklassen. Also, wenn ich meine app lief, lief er die Unterklasse Version des Codes, tat nichts, und machte mich traurig. So natürlich, sobald ich die Routine von den Subklassen entfernt, verwendet es mt „Basis“ Klasse Routine und ich bin im Geschäft.

Ich weiß. Lachen Sie nicht. Aber vielleicht wird dieser jemand die Stunde speichere ich verloren ...

Giving my 2 cents zu diesem Thema.

Ich hatte eine benutzerdefinierte UITableViewCell und es gab eine Taste, um die ganze Zelle abdeckt, so dass, wenn die Berührung passiert ist, wurde die Schaltfläche ausgewählt und nicht die Zelle.

Sie entweder die Taste löschen oder in meinem Fall, habe ich Benutzer Interation auf false Aktivieren auf die Schaltfläche, auf diese Weise die Zelle wurde derjenige ausgewählt.

Wenn Sie diese Zeilen lesen, so löst das Problem noch nicht.

Ich habe benutzerdefinierte Zelle, wo Checkbox " Benutzerinteraktion aktiviert " war zu deaktivieren. Also schalte ich einfach darauf. Viel Glück.

ich das gerade hatte und wie in der Vergangenheit mit mir passiert ist es funktionierte nicht, weil ich nicht die Aufmerksamkeit auf die die automatische Vervollständigung zahlen hat, wenn das Verfahren hinzuzufügen versuchen und ich am Ende tatsächlich tableView:didDeselectRowAtIndexPath Umsetzung. Statt tableView:didSelectRowAtIndexPath:

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 ganz anders - ich XCode neu starten :) und dann funktioniert ok! fast wie Windows:)

Wenn der Tabellenansicht im Bearbeitungsmodus ist (zB. [tableView setEditing:YES animated:NO];), müssen Sie tableView.allowsSelectionDuringEditing = YES; einstellen

Stellen Sie sicher, tableView:didSelectRowAtIndexPath implementiert und nicht tableView:didDeSelectRowAtIndexPath

Das ist mir bekommen auf mehr als ein paar Gelegenheiten !!

Ein weiterer Fehler, den Sie gemacht haben könnten (so wie ich): Wenn Sie einen Übergang an der Zelle gesetzt ist, wird didSelectRowAtIndexPath nicht genannt. Sie sollten stattdessen Ihre segues im View-Controller eingestellt.

Keine dieser Antworten für mich gearbeitet. Nach etwa einer Stunde, dachte ich, etwas sehr heimtückisch aus:

Ich habe eine Tabellenansicht in einer Zelle einer anderen Tabellenansicht. Ich beschloss, eine umschließende Ansicht zu machen, die die innere Tabellenansicht enthält, unter anderem. Ich nannte diese Ansicht und content hakte es in der xib auf.

Es stellte sich heraus, dass UITableViewCell bereits eine content hat und tut seltsame Dinge mit ihm. Das Problem selbst gelöst, wenn ich die Eigenschaft mainContentView umbenannt und wieder angeschlossen wird die Ansicht auf diese umbenannten Eigenschaft.

In meinem Fall, ich dynamisch die Höhe der TableView zur Ladezeit des SuperView berechnen. Aufgrund einer Fehlkalkulation wurde die TableView außerhalb des SuperView positioniert. Die TableView wurde fein gezeichnet, aber alle Interaktion wurde deaktiviert (und didSelectRowAtIndexPath wurde nie genannt). Sehr schwer zu erkennen, da es keine visuelle Anzeige ist, dass der TableView nicht „zugänglich“.

In meinem Fall die Lösung nicht auf YES in der folgenden Funktion zu ändern war.

iOS 9 +

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

Ok, das Aktualisieren hier, wie ich gerade lief in dieses Problem, und mein Problem war etwas anders als hier.

ich in IB und sah, dass mein Delegat gesetzt war, aber es war falsch statt Datei Besitzer (Rechtsklick auf Tabellenansicht zu sehen, wo Delegierten zeigen auf) sehen Sets.

Hoffnung, dass jemand

hilft
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top