【问题标题】:Swift collection view data being changed when scrolling滚动时更改 Swift 集合视图数据
【发布时间】:2016-08-12 01:44:29
【问题描述】:

我的收藏视图单元格在一直滚动到底部然后返回时被修改。

在我的 viewDidLoad 中,我有一个 Parse 查询,它从数据库中获取所有值,然后从主线程调用 reloadData。

在初始加载时,可视单元格会正确显示。

但是当我向下滚动时,不可见的单元格被加载,其中 1/3 显示不正确。

然后,当我向上滚动到最初的可查看单元格时,第一个单元格显示不正确。

我的意思是在我的数据库中没有正确显示是一个对齐字段。这可以保存中心、左或右字符串。

这个值是我的图像和按钮在单元格中的对齐方式。

这是我的 cellForRow 函数。

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell{
    let cell: FeedThumbnail = collectionView.dequeueReusableCellWithReuseIdentifier("feed_cell", forIndexPath: indexPath) as! FeedThumbnail

    //handle cell alignment
    if(align[indexPath.row] == "left"){
        //leave alignment as is for buttons
        if(cell.picture.frame.origin.x == 0){
            cell.picture.frame.offsetInPlace(dx: -75, dy: 0)
        }
    }

    else if(align[indexPath.row] == "center"){
        cell.holder_view.frame.offsetInPlace(dx: 105 - cell.holder_view.frame.origin.x, dy: 0)
        //leave image as is
    }

    else if(align[indexPath.row] == "right"){
        cell.holder_view.frame.offsetInPlace(dx: 220 - cell.holder_view.frame.origin.x, dy: 0)
        cell.picture.frame.offsetInPlace(dx: 100 - cell.picture.frame.origin.x, dy: 0)
    }

    return cell
}

这是我的集合视图单元格的类

 import UIKit

class FeedThumbnail: UICollectionViewCell {

 @IBOutlet weak var picture: UIImageView!
 @IBOutlet weak var comment_btn: UIButton!
 @IBOutlet weak var heart_btn: UIButton!
 @IBOutlet weak var rescip_btn: UIButton!
 @IBOutlet weak var og_btn: UIButton!
 @IBOutlet weak var name_lbl: UIButton!
 @IBOutlet weak var holder_view: UIView!
}

【问题讨论】:

  • 你能发布你的FeedThumbnail课程吗?
  • 按钮都在 holder_view 里面
  • 我的猜测是您的单元重用工作不正常。尝试在 FeedThumbnail 类中覆盖 prepareForReuse 并将所有帧重置为默认值。
  • 将所有帧重置为默认值究竟是什么意思?
  • 基本上在修改框架之前将它们设置回单元格首次加载时的状态。由于单元格被随机重用,因此位于中心的单元格可能被重用为正确的单元格。当它执行此操作时,它的框架位于中心位置,因此如果您期望它位于不同的位置,您的计算可能会关闭。

标签: ios swift uicollectionview alignment


【解决方案1】:

就像 Lumialxk 和 RPK 所说的那样。 我需要在修改之前刷新单元格 origin.x。

我想我不明白细胞会以它们原来的方式重复使用。

解决方案是覆盖 prepareForReuse 并将 frame.origin.x 设置回原始值,然后再对其进行修改。

导入 UIKit

类 FeedThumbnail: UICollectionViewCell {

@IBOutlet weak var picture: UIImageView!
@IBOutlet weak var comment_btn: UIButton!
@IBOutlet weak var heart_btn: UIButton!
@IBOutlet weak var rescip_btn: UIButton!
@IBOutlet weak var og_btn: UIButton!
@IBOutlet weak var name_lbl: UIButton!
@IBOutlet weak var holder_view: UIView!


override func prepareForReuse() {
    picture.frame.origin.x = 0
    holder_view.frame.origin.x = 0
    super.prepareForReuse()
}

}

【讨论】:

    【解决方案2】:

    cellFor... 中有一个条件,如下所示:

    if(cell.picture.frame.origin.x == 0){...
    

    如果一个单元格被重复使用,它是"left",但不满足您的条件,因此它将保持与重复使用前相同的外观。你应该对此做点什么。这是示例代码:

    if(cell.picture.frame.origin.x == 0){
        ...
    } else {
        // make it a left cell
    }
    

    【讨论】:

    • 我不完全关注:/。所以基本上我应该切换我的代码以在 else 语句而不是 if 语句中进行调整?每次看到单元格时,这不会修改内容对齐方式吗?
    • @TomGreco 对不起,我的表达不好。当你得到一个重复使用的单元格时,它可能是左、右或中心。您应该刷新它,否则您将获得一个具有原始外观的单元格。你明白吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 2022-11-22
    相关资源
    最近更新 更多