我試圖只複製必要的代碼來顯示我的問題。我有一個動態內容的桌面視圖。我創建了一個原型單元格,它有一個用戶名和10顆星(這是一個評級頁)。允許該組中的人對其他人進行評分。一切正常,但我向下滾動時遇到問題。如果我用8星評價我的第一個用戶,當我向下滾動時,位於桌面視圖底部區域的某位用戶以我給第一位用戶的費率出現。我知道tableview重用單元格。我嘗試了很多東西,但沒有成功。希望有人能幫助我。UITableView亂七八糟的行內容
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)
}
你需要記住你評價過哪些人。由於單元格是可重用對象,因此'dequeueReusableCellWithIdentifier'可以爲不同的indexPath值返回相同的單元實例。 – ozgur
您應該擁有「RatingTableViewCell」類中的評分單元格的所有邏輯。它不屬於'cellForRowAtIndexPath'函數。 – rmaddy
我有一個選定費率的數組。我在cellForRowAtIndexPath上使用它。我有一個模型是用戶[indexPath.row],我用userId == model.id來查看我的ratingArr。我聽說使用標籤來保持當前的索引是一個壞主意。也許這就是問題所在。 –