Ich habe versucht, nur den notwendigen Code zu kopieren, um mein Problem zu zeigen. Ich habe eine Tabellenansicht mit dynamischen Inhalten. Ich habe eine Prototypzelle erstellt und sie hat einen Benutzernamen und 10 Sterne (es ist eine Bewertungsseite). Personen in der Gruppe dürfen andere Personen bewerten. Alles funktioniert gut, aber ich habe ein Problem, wenn ich runterscrolle. Wenn ich meinen ersten Benutzer mit 8 Sternen bewerte, wenn ich nach unten scrolle, erscheint ein Benutzer, der sich im unteren Bereich der Tabellenansicht befand, mit der Rate, die ich meinem ersten Benutzer gegeben habe. Ich weiß, dass TableView Zellen wieder verwendet. Ich habe viele Dinge ausprobiert, aber ohne Erfolg. Hoffe jemand kann mir dabei helfen.UITableView Chaos mit dem Inhalt der Zeilen
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)
}
Sie müssen Erinnere dich, welche Leute du bewertet hast. Da Zellen wiederverwendbare Objekte sind, kann 'dequeueReusableCellWithIdentifier' die gleiche Zelleninstanz für verschiedene indexPath-Werte zurückgeben. – ozgur
Sie sollten die gesamte Logik für die Bewertungszelle in Ihrer Klasse "RatingTableViewCell" haben. Es gehört nicht in die Funktion 'cellForRowAtIndexPath'. – rmaddy
Ich habe ein Array mit ausgewählten Raten. Ich verwende es auf cellForRowAtIndexPath. Ich habe ein Modell, das der Benutzer [indexPath.row] ist, und ich schaue in meine ratingArr für den Benutzer mit userId == model.id. Ich habe gehört, dass Verwendung Tag, um den aktuellen Index zu halten ist eine schlechte Idee. Vielleicht ist das das Problem. –