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
    • 最新
    • 标签
主页 / coding / 问题 / 76947779
Accepted
Vcubbz
Vcubbz
Asked: 2023-08-22 02:09:30 +0800 CST2023-08-22 02:09:30 +0800 CST 2023-08-22 02:09:30 +0800 CST

UITableViewCell 与嵌套 UICollectionView 显示重复数据

  • 772

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

1 个回答

  • Voted
  1. Best Answer
    DonMag
    2023-08-22T05:01:57+08:002023-08-22T05:01:57+08:00

    表视图单元格被重用...

    正如您所看到的,当您为单元格设置新数据时,需要调用.reloadData()嵌入的集合视图。

    对于第二个问题 - 当单元格被重用时,嵌入的集合视图不会“重新创建”。这意味着它的滚动位置(它的内容偏移量)不会改变。

    如果您希望每次将行滚动到 view 时集合视图都从第一个单元格开始,您还需要调用:

    collectionView.scrollToItem(at: IndexPath(item: 0, section: 0), at: .left, animated: false)
    

    当单元被配置/显示时。

    如果您希望集合视图的滚动位置在滚动表格时保持不变,即:

    • 表第 0 行,将水平集合视图滚动到单元格 8
    • 向下滚动表格视图
    • 将表视图滚动回顶部,并且其集合视图仍滚动到单元格 8

    那么您需要跟踪表视图控制器中每行的集合视图的内容偏移量。

    • 0

相关问题

  • 为什么IOS多行文本输入在React原生纸张对话框中无法正常工作?

  • 是否可以在不损失视频质量的情况下录制视频的播放?

  • Swift locationManager.requestWhenInUseAuthorization() 不提示用户

  • 获取不带透明区域的图像的UIBezierPath

Sidebar

Stats

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

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +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