2016-04-27 8 views
1

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) 
} 
+1

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

+0

Sie sollten die gesamte Logik für die Bewertungszelle in Ihrer Klasse "RatingTableViewCell" haben. Es gehört nicht in die Funktion 'cellForRowAtIndexPath'. – rmaddy

+0

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. –

Antwort

1

Die Lösung dieses Problems besteht darin, das Modell zu aktualisieren, das alle Informationen für die uitableviewcell enthält. Wenn eine Bewertung für eine bestimmte Zelle aktualisiert wird, stellen Sie sicher, dass Sie diese Aktualisierung im entsprechenden Objekt/Wörterbuch in einem Array widerspiegeln. Wenn Sie eine benutzerdefinierbare Anzeigezelle haben, empfiehlt es sich, die Sterne in der "prepareForUse" -Funktion zurückzusetzen, damit bei der Wiederverwendung einer Zelle keine alten Daten verwendet werden.

0

In Ihren Kommentaren haben Sie gesagt, dass Sie ein Array mit ausgewählten Raten haben. Aber das haben Sie in Ihrem Code nicht gezeigt.

Meiner Meinung nach, müssen Sie Datensatz indexPath auch, weil indexPath.row mit Ihrer Rate Datenbindung (kann Grad sein?). Der beste Weg, dies zu tun ist das @Jay beschrieben. Und Sie sollten nicht den Code zum Konfigurieren von Zelldaten und Zellenlogik in Ihrem View-Controller schreiben.Wenn Ihre Geschäftslogik komplex ist, werden Sie feststellen, dass es ein Albtraum.^=^

Verwandte Themen