gpt4 book ai didi

ios - 滚动浏览 Collection View 时重置按钮和标签

转载 作者:行者123 更新时间:2023-11-28 14:25:42 25 4
gpt4 key购买 nike

我有一个 Collection View ,其中每个单元格都具有与用户交互的能力。每个单元格都有一个 like 按钮和一个 number of likes 标签。按下按钮时,按钮应变为青色,标签(保存喜欢的数量)应递增。此设置当前有效。但是,当我滚动浏览 Collection View 并向后滚动时,按钮恢复到其原始颜色(白色)并且标签减小到其原始值。我听说过一种名为 prepareForReuse() 的表面上有用的方法,但我可能没有正确使用它。这是我的代码:

这是包含所有单元格的数组

var objects = [LikableObject]()

这是这些对象的类定义

class LikableObject {

var numOfLikes: Int?
var isLikedByUser: Bool?

init(numOfLikes: Int, isLikedByUser: Bool) {
self.numOfLikes = numOfLikes
self.isLikedByUser = isLikedByUser
}
}

请注意,此对象中存在更多功能,但它们与此问题的目的无关。需要注意的一件重要事情是,每个单元格的数据都是使用 API 获取的。我正在使用 Alamofire 向 API 发出请求,该 API 将返回每个单元格的 numOfLikesisLikedByUser 属性的信息。

下面是我如何使用 Collection View 的委托(delegate)方法加载每个单元格:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ObjectCell", for: indexPath) as! ObjectCell
cell.configureCell(
isLikedByUser: objects[indexPath.row].isLikedByUser!,
numOfLikes: objects[indexPath.row].numOfLikes!,
)
return cell
}

ObjectCell 类具有以下三个字段:

var isLikedByUser: Bool?
@IBOutlet weak var numOfLikes: UILabel!
@IBOutlet weak var likeBtn: UIButton!

属于单元类的 configureCell() 方法在这里:

public func configureCell(numOfLikes: Int, isLikedByUser: Bool) {
self.isLikedByUser = isLikedByUser
self.numOfLikes.text = String(numOfLikes)
if isLikedByUser {
self.likeBtn.setFATitleColor(color: UIColor.cyan, forState: .normal)
} else {
self.likeBtn.setFATitleColor(color: UIColor.white, forState: .normal)
}
}

最后,prepareForReuse() 方法在这里:

override func prepareForReuse() {
if isLikedByUser! {
self.likeBtn.setTitleColor(UIColor.cyan, for: .normal)
} else {
self.likeBtn.setTitleColor(UIColor.white, for: .normal)
}
}

这行不通。即使它确实如此,我仍然不知道如何防止 numOfLikes 标签递减,或者它是否应该递减。我推测这个问题的很大一部分原因是我没有正确使用 prepareForReuse() 方法...感谢您的帮助,谢谢。

最佳答案

prepareForReuse 不是修改单元格的地方,顾名思义,您“只需”准备它以供重用。如果您更改了某些内容(例如 View 的 isHidden 属性),您只需将它们更改回初始状态即可。

不过,您应该做的是,您可以在单元格内为 isLikedByUser 实现 didSet,并将您的修改应用到其中的 likeBtn。 (这当然是快速解决方案)

长解决方案:您的单元格具有名为 isLikedByUser 的属性,这是一种反模式,TableViewCell 是一个 View ,在所有体系结构中, View 在业务逻辑方面应该尽可能地愚蠢。正确的方法是在 ViewController 中实现的 configure-cell 方法中应用这些修改。

如果你觉得你会在不同的 viewControllers 中重复使用这个单元格,至少通过协议(protocol)定义它并通过该协议(protocol)与你的单元格对话。这样您将拥有更可重用和可维护的代码。

关于ios - 滚动浏览 Collection View 时重置按钮和标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51600655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com