UITableView混乱了行内容

时间:2016-04-27 23:07:30

标签: ios swift

我试图只复制必要的代码来显示我的问题。我有一个动态内容的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)
}

2 个答案:

答案 0 :(得分:1)

解决此问题的方法是更新包含uitableviewcell所有信息的模型。每当特定单元格更新评级时,请确保在阵列中的相应对象/字典中反映该更新。此外,如果你有一个customuitableviewcell,那么重置“prepareForUse”函数中的星星可能是一个好主意,这样当一个单元被重用时,它就不会使用旧数据。

答案 1 :(得分:0)

在你的评论中,你说你有一个选定费率的数组。但你没有在你的代码中显示。

在我看来,您还需要记录 indexPath ,因为 indexPath.row 与您的费率绑定数据(可能 等级 ?)。最好的方法是@Jay描述。你不应该编写配置单元数据和单元格的代码。 ;视图控制器中的逻辑。如果您的业务逻辑很复杂,您会发现这是一场噩梦。^ = ^