didSelectRowAtIndexPath gibt einen falschen IndexPath zurück

70

Ich bin auf einen wirklich rätselhaften Fehler gestoßen. Die erste Zeile meiner UITableView gibt 1 zurück und die zweite Zeile gibt 0 im indexPath zurück! Wie ist das überhaupt möglich?

In meinem `- (void) viewDidLoad` ist noch alles in Ordnung. Ich hebe die erste Zeile erfolgreich mit hervor

currentRow = 0;
[tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:currentRow inSection:0] 
  animated:NO scrollPosition:UITableViewScrollPositionNone];

Ich habe die Variable currentRowzum Verfolgen, welche Zeile ausgewählt ist (ein anderes Steuerelement ändert sich entsprechend der aktuell ausgewählten).

Jetzt habe ich in meiner `didDeselectRowAtIndexPath`-Delegatenfunktion:

-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
...
NSLog(@"IndexPath: %@", [indexPath description]);
}

Das Protokoll zeigt Folgendes:

IndexPath: <NSIndexPath 0x79509d0> 2 indexes [0, 0]wenn ich die zweite Reihe berühre und IndexPath: <NSIndexPath 0x79509d0> 2 indexes [0, 1]wenn ich die erste Reihe berühre .

Es gibt kein Einfügen oder Löschen oder Sortieren von Zeilen usw., auch kein Scrollen. Es ist eine einfache UITableView, gruppiert, mit 1 Abschnitt und 3 Zeilen. Was könnte das verursachen?

Danke für deine Hilfe,
S.

Mundi
quelle

Antworten:

231

Sie haben umgesetzt hat De selectRowAtIndexPath . Es wird ausgelöst, wenn die Zeile nicht mehr ausgewählt ist .

Wenn Sie die zweite Zeile berühren, wird die erste Zeile nicht mehr ausgewählt , sodass [0, 1] angezeigt wird.
Wenn Sie die erste Zeile erneut berühren, wird die zweite Zeile nicht mehr ausgewählt , sodass [0, 0] angezeigt wird.

Diese werden voll und ganz erwartet.

Implementieren hat Select RowAtIndexPath, wenn Sie es benötigen, um zu antworten, wenn die Zeile ausgewählt ist .

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    //                                       ^
    ...

    NSLog(@"IndexPath: %@", [indexPath description]);
}
kennytm
quelle
15
Heh - das habe ich verpasst, als ich die Frage selbst gelesen habe. :-) Es ist, als würde das Wort "the" fehlen, wenn es zweimal verwendet wird. ;-)
Joshua Nozzi
3
Ich habe das auch einfach gemacht. Wie frustrierend. Intellisense ist in 99,9% der Fälle großartig, aber die anderen 0,1% ... wow.
Swilliams
4
Ich habe gerade einige Stunden damit verbracht herauszufinden, dass iOS mich mit der zuvor ausgewählten Zeile anruft. Ich habe alles versucht. Erstaunlich, welchen Unterschied ein paar Buchstaben machen. Geheimnis gelüftet.
1
OMG Ich habe fast eine neue Frage angefangen! Verdammt du XCode Autocomplete! Überall Upvotes!
Justin
Erstaunlich, wie viele Menschen dieses Problem hatten. Ich habe gerade die letzten 2 Stunden damit verbracht herauszufinden, was zum Teufel los war. Ich hasse dich Autocomplete.
Steve Wart
3

Trotz des Titels ist die überladene Methode tatsächlich didDeselectRowAtIndexPathso, dass das Verhalten korrekt zu sein scheint. Wenn die 1. Zeile berührt wird, wird die 0 abgewählt und umgekehrt.


quelle