Tôi đang cố gắng tìm cách tốt nhất để xử lý khôi phục trạng thái cho UICollectionView có các yếu tố có thể di chuyển xung quanh. Mục tiêu của tôi là đảm bảo rằng mục được xem lần cuối trong chế độ xem bộ sưu tập vẫn hiển thị khi khởi động lại ứng dụng, ngay cả khi các mục đã di chuyển xung quanh. Ví dụ: mục A nằm trong ô tại chỉ mục 3 khi ứng dụng bị giết và khi ứng dụng khởi động lại nếu mô hình cho biết mục A sẽ được hiển thị ở chỉ mục 4, tôi muốn chế độ xem bộ sưu tập khởi tạo bù đắp cho ô tại chỉ mục 4.Khôi phục trạng thái UICollectionView: tùy chỉnh vị trí cuộn
tôi nghĩ rằng việc thực hiện các giao thức UIDataSourceModelAssociation
trong lớp UICollectionViewDataSource
tôi sẽ chăm sóc này cho tôi, như documentation trạng thái:
[UITableView và UICollectionView] lớp học sử dụng các phương pháp của giao thức này để đảm bảo rằng các đối tượng dữ liệu giống nhau (và không chỉ các chỉ mục hàng tương tự) được cuộn vào chế độ xem và được chọn.
Tuy nhiên, những gì tôi đã quan sát thấy là thực hiện giao thức này không ảnh hưởng đến đúng indexPath của chọn tế bào trong phục hồi (mà không phải là quan trọng đối với ứng dụng của tôi), nhưng nó không ảnh hưởng đến vị trí cuộn. Vị trí cuộn (contentOffset của chế độ xem bộ sưu tập) luôn được khôi phục chính xác nơi ứng dụng bị giết và không bị ảnh hưởng bởi UICollectionViewDataSource.
Tôi có giải pháp thay thế giống như thế này. Về cơ bản nó giống như mô hình giao thức xác nhận mô hình, nhưng tôi phải làm theo cách thủ công:
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)
}
}
}
Tôi hiểu nhầm cách sử dụng UIDataSourceModelAssociation? Có lỗi không? Có cách nào thanh lịch hoặc chính xác hơn để làm việc này không?
Như tôi đã có thể nhìn thấy 'indexPathForElementWithModelIdentifier: inView: 'thiết kế để làm điều tương tự. Nó hoạt động? – orkenstein
@orkenstein Tôi đã thử sử dụng nó, nhưng nó không hoạt động. Xem OP của tôi: "triển khai thực hiện giao thức này không ảnh hưởng đúng đến indexPath của các ô đã chọn trong quá trình khôi phục (điều này không quan trọng đối với ứng dụng của tôi), nhưng nó không ảnh hưởng đến vị trí cuộn." –