Custom TableViewCell wird nicht aktualisiert

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Custom TableViewCell wird nicht aktualisiert

    Hallo,


    ich habe einen TableView mit custom TableViewCells. Die Zelle zeigt u.a. ein UILabel mit einer Entfernungsangabe. Diese Entfernungsangabe kann je nach Einstellung in den User-Settings km oder Meilen anzeigen. Wenn die App startet und der TableView geladen wird funktioniert alles und die Entfernungen werden richtig entsprechend der aktuellen Einstellung angezeigt. Aktuell und zum testen habe ich nur 3 Einträge in meinem TableView.


    Wenn ich zur Runtime von km auf Meilen umstelle wird nur ein, offensichtlich der letzte Eintrag im TableView (mit den Werten des letzten Objektes im Array) aktualisiert, aber eben nicht alle. Die Aktualisierung wird in viewWillAppear mittels [self.tableView reloadData]; getriggert. Das funktioniert auch und es wird für alle Einträge die Methode cellForRowAtIndexPath aufgerufen.


    In cellForRowAtIndexPath scheint zunächst auch alles zu passen. Diverse NSLog bestätigen, dass alle Variablen die richtigen Werte übergeben und die Methode für alle vorhaben Einträge, nämlich 3 mal aufgerufen wird. Im View wird aber wie gesagt nur der letzte Eintrag aktualisiert.


    Woran kann das liegen? Was muss ich tun um alle Einträge zu aktualisieren?


    Vorab vielen Dank für Eure Hilfe!
    "There is no spoon!"
  • cellForRowAtIndexPath

    klar...


    Quellcode

    1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    2. UITableViewCell *cell;
    3. static NSString *MyIdentifier = @"MyIdentifier";
    4. cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    5. if (cell == nil) {
    6. cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];
    7. [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
    8. cell = aCell;
    9. self.aCell=nil;
    10. }
    11. cell.backgroundView = [[[UIImageView alloc] init] autorelease];
    12. ((UIImageView *) cell.backgroundView).image = [UIImage imageNamed:@"CellBackground.png"];
    13. cell.textLabel.backgroundColor = [UIColor clearColor];
    14. cell.detailTextLabel.backgroundColor = [UIColor clearColor];
    15. cell.selectionStyle = UITableViewCellSelectionStyleNone;
    16. cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
    17. // get run data and display it in cell
    18. Run *aRun = [[Run new]autorelease];
    19. aRun = [myModel.listOfRuns objectAtIndex:indexPath.row];
    20. dateCell.text = [myModel dateToString: aRun.runDate];
    21. if (myModel.unitsMetric) {
    22. distanceCell.text = [NSString stringWithFormat:@"%3.2f km", aRun.distanceKM];
    23. NSLog(@"Metric: %d, %f", indexPath.row, aRun.distanceKM);
    24. } else {
    25. float miles = [myModel milesFromKm:aRun.distanceKM];
    26. distanceCell.text = [NSString stringWithFormat:@"%3.2f Mi.", miles];
    27. NSLog(@"Imperial: %d, %f", indexPath.row, miles);
    28. }
    29. durationCell.text = [myModel makeDurationStringFromInt: aRun.durationSec];
    30. aRun=nil;
    31. return cell;
    32. }
    Alles anzeigen

    "There is no spoon!"
  • ok, var-Namen schlecht gewählt.Seh' ich ein! DateCell, distanceCell sind eigentlich UILabels innerhalb der TableViewCell. Kann das wirklich der Punkt sein, wenn alles funktioniert, wenn der View initial geladen wird? Macht es Sinn erstmal alle Einträge im TableView zu löschen und ihn dann neu aufzubauen? Falls ja wie/wo mache ich das?

    Und ja, das mit der Custom Cell stammt aus einem Mark LaMarche Buch. Erwischt :whistling:
    "There is no spoon!"
  • doertydoerk schrieb:

    DateCell, distanceCell sind eigentlich UILabels innerhalb der TableViewCell. Kann das wirklich der Punkt sein, wenn alles funktioniert, wenn der View initial geladen wird?

    Ja, genau das ist der Punkt. Wenn der View initial geladen wird, werden ja alle Zellen erst einmal erzeugt. Da Du die Zellen aus einem Nib lädst, hast Du sicherlich dateCell, distanceCell als Outlets mit dem Interface verknüpft und beim Laden des Nibs werden die dann auch entsprechend initialisiert. Wenn nun die Tabelle neu geladen wird, werden die Zellen aber wiederverwendet, d.h. nicht aus dem Nib geladen. Die Outlets zeigen deshalb immer auf die Labels in der zuletzt aus dem Nib geladenen Zelle.

    doertydoerk schrieb:

    Macht es Sinn erstmal alle Einträge im TableView zu löschen und ihn dann neu aufzubauen?

    Nein, damit würdest Du ja gegen das Konzept der Wiederverwendung der Zellen arbeiten und dann eventuell Performanceprobleme beim Scrollen bekommen. Gib den Labels in der Zelle jeweils einen eindeutigen Tag und hol Dir die Referenzen auf diese Labels mit der Methode viewWithTag:

    Michael

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Michael ()