[iphone] UITableView reuse Problem

  • [iphone] UITableView reuse Problem

    Moin Moin,
    ich hab ein kleines problem mit dem Reuse von Zellen im UITableView

    ich fülle Zellen mit Labels und einem Bild (Fürs bild habe ich eine eigene Klasse um das Bild dort asynchron zu laden)

    jetzt würde ich aber gerne die Zellen wieder benutzen um nicht bei jedem Scrollen die bilder neuladen zu müssen

    bis 4 Zellen funktioniert das auch, bei der 5ten sagt er mir dann (NSLOG) er benutzt eine alte Zelle, was natürlich falsch ist, weil die 5te Zelle bzw. der Inhalt noch gar nicht dran war

    was mach ich falsch ?

    hier mal meine cellForRowAtIndexPath

    Quellcode

    1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    2. {
    3. [controller setTermineKategorie:YES];
    4. static NSString *CellIdentifier = @"Cell";
    5. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    6. NSString *stringImageURL;
    7. ThumbNailViewController *thumbNail;
    8. UILabel *labelUhrzeit;
    9. UILabel *labelTitel;
    10. UILabel *labelBeschreibung;
    11. if (cell == nil)
    12. {
    13. NSLog(@"NEUE ZELLE %@",indexPath);
    14. cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]autorelease];
    15. stringImageURL = [controller getTermineImageAnhandIndex:indexPath.row andSection:indexPath.section];
    16. thumbNail = [[ThumbNailViewController alloc]initWithURL:stringImageURL];
    17. [cell addSubview:thumbNail.view];
    18. labelUhrzeit = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, 80, 20)];
    19. labelUhrzeit.backgroundColor = [UIColor clearColor];
    20. labelUhrzeit.text = [controller getTermineUhrzeitAnhandIndex:indexPath.row andSection:indexPath.section];
    21. labelUhrzeit.font = [UIFont fontWithName:@"Arial" size:12];
    22. [cell addSubview:labelUhrzeit];
    23. [labelUhrzeit release];
    24. labelTitel = [[UILabel alloc]initWithFrame:CGRectMake(10, 30, 300, 20)];
    25. labelTitel.backgroundColor = [UIColor clearColor];
    26. labelTitel.text = [controller getTermineTitelAnhandIndex:indexPath.row andSection:indexPath.section];
    27. labelTitel.font = [UIFont fontWithName:@"Arial" size:16];
    28. [cell addSubview:labelTitel];
    29. [labelTitel release];
    30. labelBeschreibung = [[UILabel alloc]initWithFrame:CGRectMake(100, 40, 180, 100)];
    31. labelBeschreibung.backgroundColor = [UIColor clearColor];
    32. labelBeschreibung.numberOfLines = 5;
    33. labelBeschreibung.text = [controller getTermineBeschreibungAnhandIndex:indexPath.row andSection:indexPath.section];
    34. labelBeschreibung.font = [UIFont fontWithName:@"Arial" size:14];
    35. [cell addSubview:labelBeschreibung];
    36. [labelBeschreibung release];
    37. }else
    38. {
    39. NSLog(@"ALTE ZELLE %@",indexPath);
    40. }
    41. return cell;
    42. }
    Alles anzeigen


    ich bin eigentlich der meinung mich an den Apple Table View Programming Guide gehalten zu haben
    Ich weiß nicht immer wovon ich rede aber ich weiß das ich Recht habe. :saint:
  • Du sitzt da einem Missverständnis auf.

    Reuse bedeutet, dass eine Zelle, die oben raus gerutscht ist, unten wieder verwendet werden kann.
    (Oder unten rausrutscht und oben genommen wird.)

    Du bekommst also aus dem 'Reusable'-Pool eine fertige, aktuell nicht angezeigte Cell und kannst diese mit neuen Werten setzen.
    So werden maximal 4 Instanzen von deiner TableViewCell im Speicher gehalten, was diesen schont.

    Seine Aussage, er würde nach dem Scrollen eine alte Cell benutzen, ist also nicht völlig falsch sondern dokumentiert.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • @lucas , das hatte ich dann wirklich falsch verstanden, danke für die aufklärung

    @Drone, die 3 Zeilen label.text habe ich versucht nach der else zuzuweisen, dann bricht es aber bei der 5ten Zelle mit EXC_BAD_ACCESS ab
    jetzt versteh ich aber nicht warum dies passiert, durch das reuse nutze ich dann doch eigentlich eine der ersten 4Zellen (in denen ja schon die Subviews vorhanden sind)

    der Fehler weisst doch aber drauf hin das ich das Label nicht initialisiert habe oder ?

    bzgl. der Benennung: kannst du mir ein Beispiel geben damit ich da grundsätzlich was dran ändern kann?
    Ich weiß nicht immer wovon ich rede aber ich weiß das ich Recht habe. :saint:
  • nussratte schrieb:

    @Drone, die 3 Zeilen label.text habe ich versucht nach der else zuzuweisen, dann bricht es aber bei der 5ten Zelle mit EXC_BAD_ACCESS ab


    Na eigentlich gehören diese Elemente/Label ja als Outlet in die Zelle und du sollst via [[cell outlet] setText:] darauf zugreifen.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • hab es jetzt mit Tags gemacht

    hat erst nicht funktioniert und dann ist mir aufgefallen das ich

    Quellcode

    1. [cell addSubview:labelBeschreibung];


    gemacht habe und nicht

    Quellcode

    1. [cell.contentView addSubview:labelBeschreibung];


    jetzt scheint es aber zu gehen

    danke an euch beiden für die Hilfe.

    das mit den Outlets werde ich mir dann aber auch noch mal anschauen
    Ich weiß nicht immer wovon ich rede aber ich weiß das ich Recht habe. :saint: