Ich versuche, die beste Methode zur Verarbeitung der Statuswiederherstellung für eine UICollectionView zu finden, deren Elemente sich möglicherweise verschieben. Mein Ziel ist es, sicherzustellen, dass das zuletzt angezeigte Element in der Sammlungsansicht immer noch sichtbar ist, wenn die App neu gestartet wird, auch wenn die Elemente verschoben wurden. Zum Beispiel befindet sich Element A in Zelle bei Index 3, wenn die App beendet wurde. Wenn die App neu startet, wenn das Modell angibt, dass Element A bei Index 4 angezeigt werden soll, soll die Auflistungsansicht den Offset zur Zelle am Index initialisieren 4.UICollectionView-Statuswiederherstellung: Anpassen der Bildlaufposition
ich dachte, dass das UIDataSourceModelAssociation
Protokoll in meiner UICollectionViewDataSource
Klasse Umsetzung kümmern würde dies für mich, wie die documentation Staaten:
[UITableView und UICollectionView] Klassen verwenden, die Methoden dieses Protokolls zu gewährleisten, dass dieselben Datenobjekte (und nicht nur die gleichen Zeilenindizes) in die Ansicht gescrollt und ausgewählt werden.
Doch was ich beobachtet habe, ist, dass dieses Protokoll implementiert richtig die indexPath der ausgewählten Zellen nicht beeinträchtigt während der Wiederherstellung (was meinen App nicht wichtig ist), aber es hat keinen Einfluss auf die Bildlaufposition. Die Bildlaufposition (contentOffset der Sammlungsansicht) wird immer genau dort wiederhergestellt, wo sie war, als die App beendet wurde, und nicht von der UICollectionViewDataSource.
Ich habe einen Workaround, der so aussieht. Es ist im Grunde das gleiche Muster wie das Modell assocation Protokoll, aber ich habe es zu tun manuell:
override func encodeRestorableStateWithCoder(coder: NSCoder) {
let identifier = determineIdOfCurrentlyVisibleCell()
coder.encodeObject(identifier, forKey: "visibleCellIdentifier")
}
override func decodeRestorableStateWithCoder(coder: NSCoder) {
if let identifier = coder.decodeObjectForKey("visibleCellIdentifier") as? String {
if let indexPath = model.indexPathForIdentifier(identifier) {
collectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: .CenteredVertically, animated: false)
}
}
}
Haben falsch verstehen ich die Verwendung von UIDataSourceModelAssociation? Gibt es einen Fehler? Gibt es einen eleganteren oder korrektiveren Weg, dies zum Laufen zu bringen?
Wie ich 'indexPathForElementWithModelIdentifier sehen' entwickelt, um die gleiche Sache zu tun. Es klappt? – orkenstein
@orkenstein Ich habe es versucht, aber es hat nicht funktioniert. Siehe mein OP: "Die Implementierung dieses Protokolls beeinflusst den IndexPfad der ausgewählten Zellen während der Wiederherstellung (was für meine App nicht wichtig ist), hat aber keinen Einfluss auf die Scroll-Position." –