【问题标题】:UICollectionView cellForItemAt is called twice when scrollingUICollectionView cellForItemAt 在滚动时被调用两次
【发布时间】:2021-08-01 19:25:45
【问题描述】:

我有一个UICollectionView,具有以下设置:

Estimate Size = None

Content Insets = Never

Scroll Direction = Vertical

Paging Enabled = true

当我滚动到第二个单元格时,cellForItemAt 方法被触发两次,同时索引 1 和 2,因此,当我滑动到最后一个单元格时,cellForItemAt 方法不起作用。

  1. cellForItemAt 仅在滑动到第二个单元格时无法正常工作,在所有其他情况下都可以(每次滑动一个索引)
  2. 我还注意到cellForItemAt 不是在出现新的可见单元格时立即触发,而是延迟(顶部大约 100 像素,标准高度为 568 像素单元格)

由于这个问题,我没有在最后一个单元格上工作cellForItemAt,在单元格中也有通过 URL 加载的照片(我试过不加载图像,问题是一样的),它们在随机细胞,这也是个问题。

我不知道如何解释和解决这个问题,谢谢您的帮助

向上

override func viewDidLoad() {
        super.viewDidLoad()

        collectionView.register(UINib(nibName: TestCell.identifier, bundle: nil), forCellWithReuseIdentifier: TestCell.identifier)
        collectionView.dataSource = self
        collectionView.delegate = self
    }

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        print("cellForItemAt: \(indexPath.item)")
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: TestCell.identifier, for: indexPath) as! TestCell
        return cell
    }
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 5
    }

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
    }
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 0
    }

如果我滚动到第二个单元格,cellForItemAt 会工作两次,而当最后一个单元格时,cellForItemAt 根本不起作用。因此,最后一个小区的配置方法不起作用。我举了一个简单的例子,但问题是一样的。 如何正确加载用户滚动条上的单元格?

【问题讨论】:

  • cellForItem 可以随时以任何顺序调用。您的代码不应该对特定数量的调用或订单有任何要求。 “无法正常工作”是什么意思?它应该怎么做?它有什么作用?你能展示你的代码吗?
  • @Paulw11,为什么当我滚动一个单元格时,我加载了两个?当我到达最后一个时它根本不起作用,所以单元格本身的方法不能正常工作更新了问题。
  • 在您的 sn-p 中,cellForItemAt 没有任何反应。您将一个单元格出列并返回它,就是这样。究竟是什么不起作用?

标签: ios swift uiviewcontroller


【解决方案1】:

正如@PaulW11 在他的评论中所说,您的数据源的collectionView(_:cellForItemAt:) 方法可以随时使用任何indexPath 调用。您应该对数据源进行编码,以便在任何时间以任何顺序为任何有效的 indexPath 提供任何单元格。

唯一的限制是集合视图首先调用数据源的numberOfSections(in:)collectionView(_:numberOfItemsInSection:) 方法,并且不会请求超出这些方法指示的有效范围的 indexPath 的单元格。除此之外,您不应该对集合视图将请求的单元格或请求它们的顺序做出任何假设。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多