【发布时间】:2018-07-30 19:04:21
【问题描述】:
我有一个集合视图,其中每个单元格都具有与用户交互的能力。每个单元格都有一个like 按钮和一个number of likes 标签。当按钮被按下时,按钮应该变成青色,并且标签(包含喜欢的数量)应该增加。此设置当前有效。但是,当我滚动浏览集合视图并向后滚动时,按钮会恢复为原始颜色(白色),并且标签会减少到原始值。我听说过一种表面上很有帮助的方法,叫做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 将返回每个单元格的 numOfLikes 和 isLikedByUser 属性的信息。
这是我使用集合视图的委托方法加载每个单元格的方式:
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!
而那个属于cell类的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() 方法......感谢您的帮助,谢谢。
【问题讨论】:
-
如果用户按下按钮,你是否正确更新了你的对象数组?
-
不,那是我的第一个计划。我意识到需要修改数组,因为这是集合视图从中获取数据的结构。但是,我意识到单元类与数组没有直接关系。这很不幸,因为处理单击“赞”按钮时发生的行为的方法在单元类中,因此如果不进行大量重新布线就无法影响数组.当然,这种重新布线很可能不是最佳实践......
标签: ios swift xcode uicollectionview uicollectionviewcell