У меня проблема в моем UICollectionView, где некоторые ячейки, похоже, не являются ни частью indexPathForVisibleItems
, ни они не взяты из очереди кэширования с dequeueReusableCell
. В результате некоторые ячейки не получают требуемые обновления данных во время прокрутки и показывают старое поведение.UICollectionView Некоторые ячейки не являются ни видимыми элементами, ни выделенными ячейками
Для простоты я уменьшил проект до необходимых контроллеров и минимизировал раскадровку. В принципе, у меня есть NavigationController как EntryPoint, который содержит MainViewController, который сам содержит ContainerView с CollectionViewController.
NavigationController использует кнопку редактирования по умолчанию для переключения между режимом редактирования и без редактирования - это должно привести к отображению изображения на ячейках в режиме редактирования. Поэтому я применил setEditing
и изменил скрытое свойство изображений для всех видимых ячеек, а кроме того, я установил скрытое свойство изображений во время dequeuing - считая, что ячейки либо видны, либо они будут удалены в будущем.
Это прекрасно работает, когда CollectionView прокручивается сверху вниз. Но когда я переключаюсь из режима редактирования в режим без редактирования, прокручивая его вниз, а затем прокручивая назад, некоторые ячейки все еще отображают изображение (более конкретное: по крайней мере одна и та же строка, видимая строка). Как бы то ни было, я предполагаю, что выделенные ячейки и видимые ячейки будут комплементарными частями отображаемых данных, что должно привести к тому, что изображения будут скрыты/невидимы во время вызова setEditing
(который работает для первых 4 строк ячеек) или скрытые/нескрываемым во время (извлечение из которых работает в течение последних нескольких строк, за исключением третьей строки в моем примере)
Код для CollectionViewController:
import Foundation
import UIKit
import Photos
class CollectionViewController : UICollectionViewController {
fileprivate let CELL_ID = "PicCell"
fileprivate let IMAGE_VIEW_SIZE = 104
var selectedIndex = -1
var itemCount = 28
override func setEditing(_ editing: Bool, animated: Bool) {
super.setEditing(editing, animated: animated)
print(self.isEditing)
collectionView?.allowsMultipleSelection = editing
for indexPath in (collectionView?.indexPathsForSelectedItems)! {
collectionView?.deselectItem(at: indexPath, animated: true)
}
for indexPath in (collectionView?.indexPathsForVisibleItems)! {
let cell = collectionView?.cellForItem(at: indexPath) as? PicCell
if cell != nil {
cell?.editing = editing
}
}
}
override func viewDidLoad() {
self.navigationItem.rightBarButtonItem = self.editButtonItem
collectionView?.reloadData()
}
}
extension CollectionViewController {
override func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return itemCount;
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
print(indexPath.row)
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CELL_ID, for: indexPath) as! PicCell
cell.editing = isEditing
cell.isSelected = false
return cell;
}
}
Код для PicCell
import Foundation
import UIKit
class PicCell : UICollectionViewCell {
@IBOutlet weak var deleteBtn: UIImageView!
var editing:Bool = false{
didSet {
self.deleteBtn.isHidden = !editing
self.deleteBtn.tintColor = UIColor.blue
}
}
override var isSelected: Bool{
didSet {
if isSelected && editing {
self.deleteBtn.tintColor = UIColor.red
} else {
self.deleteBtn.tintColor = UIColor.blue
}
}
}
override func prepareForReuse() {
super.prepareForReuse()
self.editing = false
self.isSelected = false
}
}
Код для MainViewController
import Foundation
import UIKit
class MainViewController: UIViewController {
override func viewDidLoad() {
self.navigationItem.rightBarButtonItem = self.editButtonItem
}
override func setEditing(_ editing: Bool, animated: Bool) {
super.setEditing(editing, animated: animated)
collectionController?.setEditing(editing, animated: animated)
}
var collectionController : CollectionViewController? = nil
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "ShowCollectionView" {
collectionController = segue.destination as! CollectionViewController
}
}
}
, как вы можете видеть, что я буду использовать постоянные значения для количества элементов в одной секции, которая не должна быть большой сделкой.
Я не знаю, имеет ли это значение, но мои ячейки имеют ширину и высоту 104 пикселя, изображение отображается как шаблон, а UIContainerView - 343 в ширину и 473 в высоту, я тестирую на iPhone 7+ симулятор с iOS 10.1
Если есть что-то отсутствует в раскадровке, я мог бы добавить некоторые скриншоты, но я не уверен, что размещать точно
Заранее спасибо за вашу помощь и наилучшими пожеланиями
Christian
Редактирование: просто чтобы понять мой вопрос: я ищу советы для очевидных ошибок в моем коде или для доступа к UICollectionViewCells, которые не входят ни в список видимых элементов, ни из очереди во время прокрутки - может быть, есть способ доступ к этим ячейкам i simplay не знаю о
Эй, Крис. Вы решили это? –