TableView Cell Inhalt springt beim "scrollen"

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

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2020 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • Das speichern welche Buttons du schon erstellt hast führt doch nur zu Fehlern und Verwirrung.

    Nehmen wir an Zelle 1 wird am Anfang für Row 1 erstellt.
    Nun scrollst du ein wenig runter und wieder hoch.
    Row 1 kommt wieder ins Bild und dequeueReusabele... gibt dir eine verfügbare, ungenutzte Zelle.
    Diese ist aber voher z.B. zufällig für Row 8 verwendet worden und noch nie für Row 1.

    Die Buttons für Row 1 sind also nicht vorhanden und müssten von dir erstellt werden.
    Da du dir aber gespeichert hast, dass das schon passiert wäre kommt es zu einer fehlerhaften Darstellung.

    Nochmal: Es ist nicht garantiert, dass du beim erneuten Darstellen einer Tableview Reihe wieder die selbe UITableViewCell Instanz bekommst wie beim letzten mal.
    Und wenn du eine Zelle bekommst welche schon einmal verwendet wurde und mehr oder die falschen Buttons anzeigt,
    musst du dich drum kümmern, dass sie verschwinden (zusätzlich zum anzeigen des neuen Inhalte).

    Wenn sich Anzahl und Position der Buttons verändern kann man das ja trotzdem mit hidden und Positionsänderungen machen.
    Hast du aber nur ein paar Unterschiedliche Konfigurationen, sind mehrere Protoypes mit unterschiedlichen Identifiern aber sicher die bequemere Lösung.

    Damit das Scrollen flüssig bleibt würde ich nicht anfangen massig Buttons erst in der cellForRow... Methode erstellen.
    (Also beim ersten Erstellen einer Zelle ist das dort natürlich schon OK, nur nicht beim reusen.)

    Verschieben (Frame Änderung), Labeltext ändern und hide/unhide sind da mit Sicherheit die schnellere Wahl.

    Zu deiner letzten Frage:
    Natürlich kannst du zu einer reusable Cell Inhalt hinzufügen.
    Du musst ihn nur wieder entfernen wenn sie reused wird, und in ihrer neuen Position dieser Inhalt nicht gewünscht ist.

    Ob das aber ständige Erstellen/wieder Löschen beim Reusen aber nicht ein Performancekiller ist, sei aber mal dahingestellt.
  • Also wenn die Anzahl der Zeilen unter 20-30 bleibt, dann würde ich auf reused Zellen verzichten. Dafür könntest Du z.B. einfach für jede Zeile einen eigenen cellIdentifier z.B. in dem Format:

    Quellcode

    1. NSString *cellIdentifier = [NSString stringWithFormat:@"xxxx%d",indexPath.row];
    verwenden.

    Wenn Du dann wie oben eine eigene Custom Class für die UITableViewCells verwendest, dann kannst Du auch gleich ein Flag in diese Custom Class aufnehmen, ob der Content für diese Zelle schon erzeugt wurde oder nicht.

    Alternativ könntest Du Dir die erzeugten Zellen auch z.B. in einem NSMutableDictionary merken und dort mit der Zeilennummer als Key ablegen. Gibt es keine Eintrag für die Zeilennummer, dann erzeugt Du die passende Zelle für die Zeilennummer neu. Bei einem Reload der Tabelle musst Du das Dictionary leeren, damit neue passende Zellen erzeugt werden.

    Reused Zellen sind eigentlich nur dann sinnvoll, wenn alle Zellen vom Layout so gut wie identisch sind. Evtl. könntest Du auch noch versuchen für gleiche Layouts, also gleiche Anzahl an Buttons in der Zelle, den gleichen cellIdentifier zu verwenden. So dass man die Zellen mit gleichem Layout wieder verwenden kann.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von MCDan ()

  • So, hatte mir jetzt im IB einfach 5 Zellen in der TableView erzeugt, mit jeweils eigenem Identifier. Jetzt funktioniert es!

    Würde mir halt gerne die Anzahl der Zellen im Code erzeugen, damit ich nur genausoviele Zellen habe, wie ich brauche. Kannst du mir mal den Code dafür geben? Weiß nicht wie ich mir neue "atributValueCell_Pad" Zellen mit passendem Identifier erzeugen kann.