当前单元格不可见时,UICollectionView显示错误的项目数?

时间:2017-07-21 08:29:21

标签: ios swift uitableview uicollectionviewcell

我对UICollectionView中显示的项目有疑问,我不确定如何解释,但我会尽可能详细,希望有人可以帮助解决这个问题。

目前,我的UITableViewCell包含UICollectionView。每个UICollectionCell都包含一张图片,从中查找indexPath

以下示例代码是我对包含UITableViewCell的<{1}}的实现:

UICollectionView

我在我的extension MainViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { var cell: UITableViewCell = UITableViewCell() .... if indexPath.section == 4 { if let customCell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as? CustomTableViewCell { if images_ARRAY.isEmpty == false { customCell.images_ARRAY = images_ARRAY customCell.awakeFromNib() } return imagesCell } } return cell } } class CustomTableViewCell: UITableViewCell { @IBOutlet var imagesCollectionView: UICollectionView! var images_ARRAY = [UIImage]() var images = [INSPhotoViewable]() override func awakeFromNib() { super.awakeFromNib() // Initialization code print("awakeFromNib") // Through through each image of the record for image in images_ARRAY { images.append(INSPhoto(image: image, thumbnailImage: SomeClass.resized(originalImage: image, withPercentage: 0.3) ) ) } imagesCollectionView.dataSource = self imagesCollectionView.delegate = self } .... override func prepareForReuse() { super.prepareForReuse() print("prepareForReuse") images.removeAll() } } extension CustomTableViewCell: UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return images.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! ExampleCollectionViewCell print("indexPath.row = \(indexPath.item)") cell.populateWithPhoto(images[indexPath.item]) return cell } } 中使用UIImagePickerController来选择图片,在MainViewController中设置图片,并将其显示在UICollectionViewCell中,如下所示:

UITableViewCell

每次用户选择图片时,extension MainViewController: UIImagePickerControllerDelegate { func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let selectedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { // Store and display the image if let cell = mainVCTableView.cellForRow(at: IndexPath(row: 0, section: 4) ) as? CustomTableViewCell { cell.images_ARRAY.append(selectedImage) // Remove any existing images before adding all images again cell.images.removeAll() cell.awakeFromNib() cell.imagesCollectionView.reloadData() images_ARRAY = cell.images_ARRAY if ( (images_ARRAY.count - 1) % 4) == 0 && images_ARRAY.count != 1 { self.mainVCTableView.reloadRows(at: [ IndexPath(row: 0, section: 4) ], with: UITableViewRowAnimation.none) } } } picker.dismiss(animated: true, completion: nil) } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { picker.dismiss(animated: true, completion: nil) } } 数组中的所有图片都会被删除,并在重新加载images之前从images_ARRAY重新添加。添加4张图片时,imagesCollectionView如下所示:

enter image description here

添加第5张图片后,UITableViewCell会动态更改其高度,因此会UITableViewCell代码,只要添加了第9,13,17等图像,就会重新加载行。展开self.mainVCTableView.reloadRows

的高度

enter image description here

我遇到的问题是添加第9张图片时,屏幕上看不到该单元格,因此调用UITableViewCell时最终会调用self.mainVCTableView.reloadRows我的cellForItemAtCustomTableViewCell 最初报告为 4 ,然后从0,1,2等开始。

以下2个屏幕截图是将第8个(左)和第9个(右)图像添加到indexPath.item

enter image description here enter image description here

正如你在右边看到的那样,第6,第7和第8张图像已经消失,我有一个空行空间,第9张图像应该是。

向下滚动表格视图显示:

enter image description here

添加第9张图像后,UICollectionView的打印显示如下:

indexPath.item

但是,一旦我添加了第10张图片,当重新加载indexPath.row = 4 indexPath.row = 0 indexPath.row = 1 indexPath.row = 2 indexPath.row = 3 indexPath.row = 4 indexPath.row = 5 indexPath.row = 6 indexPath.row = 7 时,所有图片都会重新显示:

enter image description here

添加第10张图像后的打印输出显示:

imagesCollectionView

我不太明白发生了什么事?我为这篇长篇文章道歉,但希望具体解决我的问题并展示插图,以便有人能够更好地理解我的帮助。

谢谢!

1 个答案:

答案 0 :(得分:1)

@Aravind A R 的建议,但是在返回单元格之前,通过重新加载UICollectionView cellForRowAt来解决该问题:

if images_ARRAY.isEmpty == false
{
    customCell.images_ARRAY = images_ARRAY
    customCell.awakeFromNib()

    customCell.imagesCollectionView.reloadData()
}