Ich muss eine Operation ausführen, wenn UICollectionView vollständig geladen wurde, dh zu diesem Zeitpunkt sollten alle Datenquellen- / Layoutmethoden von UICollectionView aufgerufen werden. Woher weiß ich das?? Gibt es eine Delegatenmethode, um den Ladezustand von UICollectionView zu ermitteln?
uicollectionview
delegates
reload
Jirune
quelle
quelle
[self.collectionView removeObserver:self forKeyPath:@"contentSize" context:NULL];
zu-viewWillDisappear:animated:
auch.Das hat bei mir funktioniert:
Swift 4-Syntax:
quelle
reloadData
erfrischt dencollectionView
so zieht es auf wieder seine Datenquelle Methoden ... derperformBatchUpdates
hat einen Block Abschluss so angebracht , dass , wenn beide auf dem Haupt - Thread ausgeführt werden Sie beliebigen Code wissen , dass Put anstelle von/// collection-view finished reload
ausführen werde mit einem frischen und angelegtcollectionView
Es ist eigentlich ziemlich einfach.
Wenn Sie beispielsweise die reloadData-Methode von UICollectionView oder die invalidateLayout-Methode des Layouts aufrufen, gehen Sie wie folgt vor:
Warum das funktioniert:
Der Haupt-Thread (in dem wir alle UI-Updates durchführen sollten) enthält die Hauptwarteschlange, die serieller Natur ist, dh auf FIFO-Weise funktioniert. Im obigen Beispiel wird also der erste Block aufgerufen, bei dem unsere
reloadData
Methode aufgerufen wird, gefolgt von allem anderen im zweiten Block.Jetzt blockiert auch der Haupt-Thread. Wenn Sie also
reloadData
3s für die Ausführung benötigen, wird die Verarbeitung des zweiten Blocks um diese 3s verzögert.quelle
reloadData
Jetzt wird das Laden der Zellen in den Hauptthread in die Warteschlange gestellt (auch wenn sie vom Hauptthread aufgerufen werden). Die Zellen werden alsocellForRowAtIndexPath:
nach derreloadData
Rückkehr nicht geladen ( nicht aufgerufen) . Wenn Sie den Code einschließen, der ausgeführt werden soll, nachdem Ihre Zellen geladen wurden,dispatch_async(dispatch_get_main...
und diesen nach Ihrem Aufruf aufrufen,reloadData
wird das gewünschte Ergebnis erzielt.Nur um eine großartige @ dezinezync-Antwort hinzuzufügen:
Swift 3+
quelle
Mach es so:
quelle
Wie dezinezync antwortete, müssen Sie einen Codeblock
reloadData
von einemUITableView
oder an die Hauptwarteschlange sendenUICollectionView
senden, und dieser Block wird dann ausgeführt, nachdem die Zellen aus der Warteschlange entfernt wurdenUm dies bei der Verwendung klarer zu gestalten, würde ich eine Erweiterung wie die folgende verwenden:
Es kann auch zu einer implementiert werden
UITableView
undquelle
Ein anderer Ansatz mit RxSwift / RxCocoa:
quelle
performBatchUpdates
hat in meinem Fall nicht funktioniert, dieser macht es. Prost!Versuchen Sie, einen synchronen Layoutdurchlauf über layoutIfNeeded () direkt nach dem Aufruf von reloadData () zu erzwingen. Scheint sowohl für UICollectionView als auch für UITableView unter iOS 12 zu funktionieren.
quelle
Das funktioniert bei mir:
quelle
Ich musste einige Aktionen für alle sichtbaren Zellen ausführen, wenn die Sammlungsansicht geladen wurde, bevor sie für den Benutzer sichtbar ist. Ich habe Folgendes verwendet:
Achten Sie darauf, dass dies beim Scrollen durch die Sammlungsansicht aufgerufen wird. Um diesen Overhead zu vermeiden, habe ich Folgendes hinzugefügt:
und in der Aktion selbst:
Die Aktion wird weiterhin mehrmals ausgeführt, wie die Anzahl der sichtbaren Zellen im Ausgangszustand. Bei all diesen Anrufen haben Sie jedoch die gleiche Anzahl sichtbarer Zellen (alle). Das boolesche Flag verhindert, dass es erneut ausgeführt wird, nachdem der Benutzer mit der Sammlungsansicht interagiert hat.
quelle
Ich habe gerade Folgendes getan, um etwas auszuführen, nachdem die Sammlungsansicht neu geladen wurde. Sie können diesen Code auch in API-Antworten verwenden.
quelle
Auf jeden Fall:
Rufen Sie dann so in Ihrem VC an
Stellen Sie sicher, dass Sie die Unterklasse verwenden !!
quelle
Diese Arbeit für mich:
quelle
Laden Sie collectionView einfach in Batch-Updates neu und überprüfen Sie dann im Abschlussblock, ob es fertig ist oder nicht, mit Hilfe des booleschen "finish".
quelle
Die beste Lösung, die ich bisher gefunden habe, ist die Verwendung
CATransaction
, um die Fertigstellung zu handhaben.Swift 5 :
quelle
So habe ich das Problem mit Swift 3.0 gelöst:
quelle
Versuche dies:
quelle
Sie können so tun ...
quelle