要素が移動する可能性のある UICollectionView の状態の復元を処理する最良の方法を見つけようとしています。私の目標は、アイテムが移動した場合でも、アプリを再起動したときに、コレクション ビューで最後に表示されたアイテムが引き続き表示されるようにすることです。たとえば、アイテム A は、アプリが強制終了されたときにインデックス 3 のセルにあり、アイテム A をインデックス 4 に表示する必要があるとモデルが指示している場合にアプリを再起動すると、コレクション ビューでインデックス 4 のセルへのオフセットを初期化する必要があります.
ドキュメントに記載されているように、クラスにUIDataSourceModelAssociation
プロトコルを実装することでこれを処理できると思いました。UICollectionViewDataSource
[UITableView および UICollectionView] クラスは、このプロトコルのメソッドを使用して、同じデータ オブジェクト (同じ行インデックスだけでなく) がスクロールされて表示され、選択されるようにします。
ただし、私が観察したことは、このプロトコルを実装すると、復元中に選択したセルの indexPath に適切に影響することですが(これは私のアプリにとって重要ではありません) 、スクロール位置には影響しません。スクロール位置 (コレクション ビューの contentOffset) は、アプリが強制終了されたときの正確な位置に常に復元され、UICollectionViewDataSource の影響を受けません。
このような回避策があります。基本的にモデル アソシエーション プロトコルと同じパターンですが、手動で行う必要があります。
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)
}
}
}
UIDataSourceModelAssociation の使い方を誤解していませんか? バグはありますか?これを機能させるためのよりエレガントな、または正しい方法はありますか?