我有一个表视图,其中每个单元格都包含一个集合视图。每个集合视图都有图像的水平幻灯片。每个表视图单元格都配置有一个视图模型,其中包含一个 imageURL 数组,供嵌套集合视图用作数据源。一切正常,直到我需要加载第二页数据。将第二页数据加载到表视图中后,第二页项目似乎与第一页上的项目重复。但这很奇怪,因为我在这个集合视图下也有一个页面控件,它配置了 imageURLs 数组的计数,并且页面数是正确的。只是图像本身复制了第一页。
这是表视图上的 cellForRow:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: DataTableViewCell.id, for: indexPath) as! DataTableViewCell
cell.delegate = self
cell.configureWith(viewModel.getViewModelAt(indexPath.row))
return cell
}
这是嵌套集合视图上的 cellForItem:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if indexPath.row == 0 {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CensoredDataCollectionViewCell.id, for: indexPath) as! CensoredDataCollectionViewCell
cell.setRemoteImage(with: viewModel.photoGalleryURLStrings[0])
return cell
}
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: ImageCollectionViewCell.id, for: indexPath) as! ImageCollectionViewCell
let imageURLString = viewModel.photoGalleryURLStrings[indexPath.row - 1]
cell.setRemoteImage(with: imageURLString)
return cell
}
该setRemoteImage
方法只是根据服务器上的图像设置单元格的图像视图。这indexPath.row - 1
是因为集合视图在开头有一个额外的单元格。
这是视图控制器中的代码,在到达底部时进行新的网络调用:
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if indexPath.row == viewModel.dataCount - 1 {
tableViewFooterLoadingWheel.startAnimating()
viewModel.downloadData { [weak self] moreData in
if moreData {
DispatchQueue.main.async {
self?.tableView.reloadData()
}
}
DispatchQueue.main.async {
self?.tableViewFooterLoadingWheel.stopAnimating()
}
}
}
}
以下是网络调用的成功案例,其中新项目被附加到数据源:
case .success(let result):
strongSelf.data.append(contentsOf: result.results)
if let next = result.next {
strongSelf.dataURL = next
} else {
strongSelf.dataURL = nil
}
completion(true)
为了进行测试,初始网络调用将为我的表视图提供 5 个项目。前 2 项的嵌套集合视图都只有一张图像。一旦我加载了第二个页面(出于测试目的,该页面仅包含 2 个项目),这两个项目与第 1 页上的前两个项目具有相同的图像。但正如前面提到的,页面控制页面的数量映射到图像 URL 的正确数量。所以某处图像的计数是完全正确的。只是不是真实的图像。
如果某些代码不是必需的,我们深表歉意。请不要建议我重置prepareForReuse()中的内容,除非这是我能做的,正如苹果所说的不要这样做。如果您能帮助我,请提前致谢。
编辑以包括configureWith()函数:
func configureWith(_ viewModel: dataViewModel) {
self.dataViewModel = viewModel
loadingWheel.startAnimating()
avatarImageView.loadImageFromURL(dataViewModel.avatarImageURLString) { [weak self] in
DispatchQueue.main.async {
self?.loadingWheel.stopAnimating()
}
}
statusLabel.text = dataViewModel.status
createdAtLabel.text = dataViewModel.created
photoGalleryPageControl.numberOfPages = dataViewModel.photoGalleryURLStrings.count
likesCountLabel.text = "\(dataViewModel.likeCount)"
likesButton.isSelected = dataViewModel.isLiked
commentsCountLabel.text = dataViewModel.commentCount
}