AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-13913515

Vcubbz's questions

Martin Hope
Vcubbz
Asked: 2023-08-22 02:09:30 +0800 CST

UITableViewCell 与嵌套 UICollectionView 显示重复数据

  • 5

我有一个表视图,其中每个单元格都包含一个集合视图。每个集合视图都有图像的水平幻灯片。每个表视图单元格都配置有一个视图模型,其中包含一个 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
}
ios
  • 1 个回答
  • 24 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve