tableView: cellForRowAtIndexPath: nicht nur für sichtbare Zellen aufgerufen werden?

8

Ich habe eine TableView mit Abschnitten, die geöffnet und geschlossen werden können. Wenn ich also auf einen Abschnitt klicke, um ihn zu öffnen, wird er mit Zellen gefüllt und -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *) wird genau so oft aufgerufen wie in -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section .

Stimmt das? Sollte es nicht nur die Anzahl der sichtbaren Zellen sein?

Weil ich in meinem Fall eine schlechte Situation habe: Ich habe viele benutzerdefinierte Zellen (50 ~ 100 Zellen) und den Aufruf von -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *) für jede Zelle verlangsamt die Öffnung eines Abschnitts, weil jedes Mal das Lesen von Nib durchgeführt wird und Zellinhalt wird mit Bild gefüllt. Ich habe die Sichtbarkeit der Zelle in -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *) wie folgt überprüft:

%Vor%

und es zeigt, dass von 45 Zellen nur 6 oder 7 sichtbar sind. Andere sind außerhalb des sichtbaren Bereichs. Aber das Erstellen von Zellen wurde noch ausgeführt. Hier ist der Code:

%Vor%

Stimmt das immer noch? Oder vermisse ich etwas?

    
peetonn 14.02.2012, 23:57
quelle

5 Antworten

5

Nun, ich habe mich irgendwie mit meinem Problem beschäftigt. Hier sind meine Ideen und Gedanken, wie ich zu der Lösung gekommen bin. Vielleicht könnte es für jemanden hilfreich sein.

Ich habe Speicherzuweisungen angewiesen und Callstacks mit Instrumenten während des Öffnens von Sektionsereignissen aufgerufen. Es zeigte mir, dass die meiste Zeit damit verbracht wird, Zellen aus der Nib-Datei zu laden.

Zuerst habe ich die Größe der nib-Datei reduziert, dh die Anzahl der Ansichten in einer benutzerdefinierten Tabellenansichtszelle minimiert (jetzt sind es nur noch 2 Ansichten und 2 Beschriftungen statt 6 Ansichten) , 2 Bilder und 2 Etiketten vorher). Es gab mir eine Verbesserung der Zellenladung. Die Apple-Dokumentation schlägt vor, möglichst wenige Ansichten zu verwenden und keine Transparenz zu verwenden. Achte also auf diese Vorschläge.

Zweitens, wie ich zuvor entdeckt habe, dass nicht alle Zellen sichtbar sind, die von -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *) erstellt werden, habe ich beschlossen, irgendwie die Anzahl der Ladevorgänge neuer Zellen aus der NIB-Datei zu reduzieren. Um dies zu erreichen, habe ich eine einfache Idee: leere Standardzellen für unsichtbare Zeilen zurückgeben, während benutzerdefinierte Zellen von der Spitze für sichtbare geladen werden. Hier ist das Stück Code:

%Vor%

Wie Sie sehen, verwende ich nicht nur -(NSArray*)indexPathsForVisibleRows method von tableview zum Erkennen von sichtbaren Zellen. Stattdessen habe ich meine eigene Methode -(NSMutableArray*)getExtendedVisibleIndexPathsForTableView:(UITableView*)tableView geschrieben. Dies war notwendig, weil bei Verwendung von -(NSArray*)indexPathsForVisibleRows die Zellen neben der letzten sichtbaren Zelle oder die Zellen vor der ersten sichtbaren Zelle als leere Zellen erstellt wurden und beim Scrollen wie leere Zellen aussahen. Um dies zu umgehen, füge ich in -(NSMutableArray*)getExtendedVisibleIndexPathsForTableView: (UITableView*)tableView den sichtbaren Array-Zellen Randzellen hinzu:

%Vor%

Dadurch habe ich die Zeit für das Öffnen von Sektionen mit einer großen Anzahl von benutzerdefinierten Zellen reduziert, was von Instruments verfolgt und gespürt wurde, während ich die App erlebte.

    
peetonn 15.02.2012, 15:48
quelle
2

Überprüfen Sie Ihre Tabellenansicht. Möglicherweise ist Ihre Tabellenansichtshöhe sehr groß, sodass die Zellen so lange geladen werden, bis Ihre Zelle die gesamte Tabellenansichtsgröße erreicht.

    
Moaz Saeed 08.01.2015 11:23
quelle
0

Das scheint richtig zu sein. Die Idee, das Laden selbst zu optimieren, liegt darin, wie "dequeueReusableCellWithIdentifier" funktioniert. Wenn Sie das Bild von einem entfernten Standort laden, sollten Sie den Code optimieren. aber nicht vom Laden von Zellen, da dies hier richtig aussieht.

    
Ehab Amer 15.02.2012 00:05
quelle
0

Ich habe eine ähnliche Technik verwendet, aber da indexPathsForVisibleRows sortiert ist, brauchen Sie kein containsObject. Stattdessen können Sie einfach tun:

%Vor%

Übrigens; Dies setzt voraus, dass Sie nur einen Abschnitt verwenden. Es funktioniert nicht für mehr als einen Abschnitt.

    
fz. 07.01.2013 18:18
quelle
0

Das Hinzufügen eines anderen löste mein Problem. Wo ich alle Änderungen zurückgesetzt habe, die an der Zelle vorgenommen wurden.

%Vor%     
YaBoiSandeep 22.01.2014 04:40
quelle

Tags und Links