2012-11-26 7 views
5

Wenn ich ein festes UITableViewCell mit revealeidentifier = nil als ein ivar und diese Instanz für eine bestimmte Zeile zurückgeben und dann diese Zeile speziell mit [tableView reloadRowsAtIndexPaths:withRowAnimation:] neu laden, verschwinden die Zeileninhalte (oder manchmal flimmern). Wenn ich weg und zurück scrolle, wird es wieder sichtbar. Wenn ich [tableView reloadData] auf der anderen Seite mache, wird es nicht verschwinden.Warum verschwindet ein manuell wiederverwendetes UITableViewCell beim Zeilen-Neuladen?

  • Warum es nicht verschwindet, wenn ich die Zeile neu zu laden?
  • Warum nicht, wenn ich den ganzen Tisch neu lade?

Hier ist ein Beispielprojekt: https://github.com/hannesoid/HOTableViewTests

ich dies auf iOS 6. getestet weiß ich, dass manuell eine UITableViewCell in einer solchen Art und Weise die Wiederverwendung (mit aus reuseidentifier & Warteschlangenauflösungs) wird normalerweise nicht empfohlen, aber in einigen ziemlich statischen Szenarien würde es die Dinge vereinfachen.

Antwort

1

UITableView wurde von Apple so optimiert, dass es eine relativ kleine Speichermenge verwendet und dennoch eine gute Leistung für die Anzeige von Zellen auf dem Bildschirm bietet. Wenn Sie etwas nicht-Standard wie diese tun, und die Optimierung umgehen, werfen Sie die ganze Maschine aus dem Gleichgewicht. Hier ist, was ich vorschlage. Wenn Sie eine bestimmte Zeile haben, die Sie jetzt als Instanzvariable haben, warum nicht einfach versuchen, ihr einen eindeutigen Namen für ihren Wiederverwendungsidentifikator zu geben? Lass das Kit es ausarbeiten.

0

Es ist keine gute Praxis, reuseIdentifier gleich nil zu machen. Initialisiere immer reuseIdentifier mit einem String/Namen. Die cellForRowAtIndexPath lädt Zeilen neu, indem sie auf ihre reuseIdentifiers schaut. Wenn zwischengespeicherte Zellen mit einem vorhandenen reuseIdentifier gefunden werden, werden diese Zellen direkt angezeigt, ohne dass ein neues zugewiesen und initialisiert wird. Making it nil verursacht Problem. Also, machen Sie [email protected]"cell" oder etwas, das Sie mögen. Dies wird dein Problem lösen.