2017-02-16 7 views
0

У меня проблема в моем 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 не знаю о

+0

Эй, Крис. Вы решили это? –

ответ

2

Вы можете изменить это поведение, если отключить предзапросы:

collectionView?.isPrefetchingEnabled = false 

Или вы можете сохранить его, но затем:

  • крюк в UICollectionViewDelegate методы didEndDisplaying и willDisplay, чтобы знать, как клетки появляются и исчезают независимо от cellForItemAt; или

  • У меня есть ячейки, которые имеют некоторые КВО на каком-либо устройстве контроллера вида или наблюдают за тем, что контроллер представления будет инициировать, чтобы узнать, нужно ли менять их состояние.

+0

Эй, Роб, это буквально сводило меня с ума, удивительный совет! –