我试图只复制必要的代码来显示我的问题。我有一个动态内容的tableview。我创建了一个原型单元格,它有一个用户名和10颗星(它是一个评级页面)。该组中的人员可以为其他人评分。一切正常,但是当我向下滚动时我遇到了问题。如果我将我的第一个用户评为8星,当我向下滚动时,那个位于tableview底部区域的用户会显示我给第一个用户的费率。我知道tableview重用单元格。我尝试过很多东西但没有成功。希望有人可以帮助我。
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let model = users[indexPath.row]
let cell = tableView.dequeueReusableCellWithIdentifier("RatingCell") as! RatingTableViewCell
cell.tag = indexPath.row
cell.playerLabel.text = model.name
cell.averageView.layer.borderWidth = 1
cell.averageView.layer.borderColor = Color.Gray1.CGColor
cell.averageView.layer.cornerRadius = 5
cell.starsView.userInteractionEnabled = true
cell.averageLabel.text = "\(user.grade)"
for i in 0...9 {
let star = cell.starsView.subviews[i] as! UIImageView
star.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(starTap)))
star.userInteractionEnabled = true
star.tag = i
star.image = UIImage(named: (i + 1 <= grade ? "star-selected" : "star-empty"))
}
return cell
}
func changeRating(sender: UIImageView) {
let selectedStarIndex = sender.tag
let cell = sender.superview?.superview?.superview as! RatingTableViewCell
let model = users[cell.tag]
let stars = sender.superview?.subviews as! [UIImageView]
cell.averageLabel.text = "\(selectedStarIndex + 1)"
for i in 0...9 {
let imgName = i <= selectedStarIndex ? "star-selected" : "star-empty"
stars[i].image = UIImage(named: imgName)
}
}
func starTap(gesture: UITapGestureRecognizer) {
changeRating(gesture.view as! UIImageView)
}
答案 0 :(得分:1)
解决此问题的方法是更新包含uitableviewcell所有信息的模型。每当特定单元格更新评级时,请确保在阵列中的相应对象/字典中反映该更新。此外,如果你有一个customuitableviewcell,那么重置“prepareForUse”函数中的星星可能是一个好主意,这样当一个单元被重用时,它就不会使用旧数据。
答案 1 :(得分:0)
在你的评论中,你说你有一个选定费率的数组。但你没有在你的代码中显示。
在我看来,您还需要记录 indexPath ,因为 indexPath.row 与您的费率绑定数据(可能 等级 ?)。最好的方法是@Jay描述。你不应该编写配置单元数据和单元格的代码。 ;视图控制器中的逻辑。如果您的业务逻辑很复杂,您会发现这是一场噩梦。^ = ^