HIGHFROWATInDEXPATH wird für alle Zeilen gefordert und wie viele Zeilen in einem UitableView vor Leistungsproblemen?

StackOverflow https://stackoverflow.com/questions/5324205

Frage

Ich dachte, ich hätte das für a gelesen UITableView das heightForRowAtIndexPath Wird nicht alle Reihen aufgerufen, sondern nur auf die sichtbaren. Das sehe ich jedoch nicht. Ich sehe Hunderte von Anrufen heightForRowAtIndexPath Für die einfache Situation der Orientierung, die zum Beispiel des iPhone geändert wird.

Also gehe ich hier davon aus, dass für a UITableView mit heightForRowAtIndexPath implementiert, es tut (dh heightForRowAtIndexPath) Erhalten Sie alle Zeilen (nicht nur die sichtbaren) ... lassen Sie mich wissen, ob dies nicht richtig ist.

Frage: Angesichts der oben genannten, wie viele Zeilen in a UITableView (wo heightForRowAtIndexPath Sind Sie implementiert) Können Sie in der Regel Leistungsprobleme auftreten?

Gibt es einen Weg rund um die Leistungsprobleme? dh ein nominal/Standardhöhe für jede Zeile festgelegt und nicht implementiert heightForRowAtIndexPath, aber dann stellen Sie dann jede Zeilenhöhe nur richtig ein, wenn sie angezeigt wird, und stellen Sie sie hier richtig ein ... aber in welcher Methode würde man dies tun?

War es hilfreich?

Lösung

Schauen Sie sich den Diskussionsabschnitt in der tableView:heightForRowAtIndexPath: Dokumentation

Die Methode ermöglicht es dem Delegierten, Zeilen mit unterschiedlichen Höhen anzugeben. Wenn diese Methode implementiert ist, überschreibt der von ihm zurückgegebene Wert den für die RowHeight -Eigenschaft von UitableView für die angegebenen Zeile angegebene Wert.

Die Verwendung von Tabellenansicht: HigheForrowatIndexPath: Anstelle der RowHeight -Eigenschaft gibt es Leistungsauswirkungen auf. Jedes Mal, wenn eine Tabellenansicht angezeigt wird, ruft sie TableView: HighForrowatIndexPath: Auf dem Delegierten für jede seiner Zeilen auf, was zu einem erheblichen Leistungsproblem mit Tabellenansichten mit einer großen Anzahl von Zeilen (ca. 1000 oder mehr) führen kann.

Sie sollten also die verwenden rowHeight Eigentum des UitableView. Wenn Sie unterschiedliche Höhen benötigen, haben Sie kein Glück, weil Sie verwenden müssen tableView:heightForRowAtIndexPath:.

Afaik Es gibt keine Möglichkeit, die Zeilenhöhe bei der Anzeige zu ändern.
Die Tabellenansicht muss die richtige Größe zuvor kennen, was auch immer hässliche Positionsverschiebungen geben würde.

Andere Tipps

Ich glaube, ich habe eine Lösung dafür gefunden.

In iOS 7 hat Apple einige neue Tabellenansicht -Eigenschaften eingeführt. Einer von ihnen ist das:

tableView:estimatedHeightForRowAtIndexPath:

Wenn Sie also beispielsweise eine geschätzte Zeilenhöhe liefern, wird bei Tabelleview: HighForrowatIndexPath: wiederholt aufgerufen, bevor die Tabelle angezeigt wird, nur für die sichtbaren Zellen der Tabelle aufgerufen. Für die verbleibenden Zellen wird die geschätzte Höhe verwendet.

Hier ist die Quelle für diese Informationen: https://books.google.gr/books?id=wLaVBQAAQBAJ&pg=PT521&lpg=PT521&dq=heightforrowatindexpath+only+for+the+visible+cells&source=bl&ots=7tuwaMT5zV&sig=h3q8AaFvoCgcrPu2fQchVkIEjwg&hl=en&sa=X&ved=0CEMQ6AEwBWoVChMInLK0xbPuxwIVCbUaCh3_nQWG#v=onepage&q=heightforrowatindexpath% 20only%20for%20The%20visible%20 Zellen & F = Falsch

Meine Güte, ich habe über eine Stunde damit verbracht, die Quelle meines Leistungsproblems zu finden!

Schließlich fand ich auch Hunderte von Anrufen zum Height -ForrowatIndexPath und eine Suche brachte mir diesen Thread. Das ist wirklich nervig. Die Leistung geht hier bereits ab, wenn nur 250 Elemente angezeigt werden. Zum Glück haben die Zellen, die ich jetzt anzeigen möchte, alle die gleiche Größe. Aber ich könnte mir vorstellen, dass jemand, der verschiedene Zellen für eine Tabellenansicht mit> 200 Elementen anzeigen möchte!

Fix diesen Apfel!

Prost

Eine Möglichkeit, die Leistung in Tabellenansicht mit einer großen Anzahl von Zeilen und dynamischen Zellhöhen zu verbessern, besteht darin, die Höhe der Zellen zu speichern, sobald sie zum ersten Mal berechnet werden.

Ein vereinfacher Ansatz, um dies zu erreichen, besteht darin, a zu führen NSMutableDictionary in dem der Schlüssel die ID des Datensatzes in der Zelle (oder eine andere Kennung) ist, und der Wert ist a NSNumber mit der Höhe der Reihe. Sobald die Höhe zum ersten Mal berechnet wird, speichern Sie sie die NSMutableDictionary durch die Datensatz -ID. In dem tableView:heightForRowAtIndexPath und tableView:estimatedHeightForRowAtIndexPath: Sie suchen nach einer zwischengespeicherten Höhe im Wörterbuch und geben es zurück, wenn es gefunden wird. Wenn nicht gefunden, berechnen Sie die Höhe und speichern Sie den Cache, bevor Sie die Höhe zurückgeben.

Möglicherweise müssen Sie vorsichtig sein, wenn Sie den Cache für die Zeilen ungültig machen, die die Höhen ändern. Wenn Sie beispielsweise eine Expand -Taste in einer Ihrer Zellen haben, müssen Sie die Höhe dieser Zelle aus dem Cache entfernen, sobald die Taste für die Höhe des Erweiterungsschaltes für die Höhe aufgerufen wird.

Möglicherweise haben Sie immer noch einen Leistungstreffer, wenn Sie versuchen, 1000 Zellen gleichzeitig anzuzeigen, wenn die Tabelle angezeigt wird, da sie wahrscheinlich die Höhenmethode für jede Zeile aufgerufen wird. Eine Arbeit dafür besteht darin, den Cache zuerst in einer Hintergrundaufgabe zu erwärmen, bevor die Zellen zuerst angezeigt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top