2017-10-15 3 views
0

Ich habe benutzerdefinierte Tabellenansicht Zelle mit Bewertungssterne. Ich benutze https://github.com/hsousa/HCSStarRatingView für die Bewertung Ansicht. dort ist mein Code für Tabellenansicht und Zellenansicht.Wenn Inhalt der Scroll-Tabellenansicht geändert wird

class RatingTableViewCell: UITableViewCell { 

     var value : CGFloat = 0.0 
     @IBOutlet weak var starRatingView: HCSStarRatingView! 
     @IBOutlet weak var titleLabel: UILabel! 
     override func awakeFromNib() { 
      super.awakeFromNib() 
      initStarRatingView() 
      starRatingView.addTarget(self, action: #selector(DidChangeValue(_:)), for: .valueChanged) 

     } 

     override func setSelected(_ selected: Bool, animated: Bool) { 
      super.setSelected(selected, animated: animated) 

      // Configure the view for the selected state 
     } 

     private func initStarRatingView() { 
     var scalingTransform : CGAffineTransform! 
     scalingTransform = CGAffineTransform(scaleX: -1, y: 1); 
     starRatingView.transform = scalingTransform 
     starRatingView.emptyStarImage = #imageLiteral(resourceName: "strokStar") 
     starRatingView.halfStarImage = #imageLiteral(resourceName: "halfStar") 
     starRatingView.filledStarImage = #imageLiteral(resourceName: "fillStar") 
     starRatingView.allowsHalfStars = true 
     } 


     @IBAction func DidChangeValue(_ sender: HCSStarRatingView) { 

     self.value = sender.value 
     } 

class RatingViewController: CustomViewController,UITableViewDelegate,UITableViewDataSource { 

    var values : [CGFloat] = [0.5,0.0,0.0,0.0,0.0,0.0,0.0] 
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCell(withIdentifier: "RatingTableViewCell", for: indexPath) as! RatingTableViewCell 

    values[indexPath.row] = cell.value 
    cell.starRatingView.value = values[indexPath.row] 
    return cell 
    } 
//MARK: _Table data source 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    values.count 
    } 

} 

gibt es ein Problem, wenn ich Tabellenansicht blättern. die wiederverwendbaren Zellendaten aus der Warteschlange entfernen, ist falsch. Wie können Wertdaten für jede Zelle aktualisiert werden?

Antwort

1

Das Problem besteht darin, dass Sie den Wert in der Zelle speichern. Werfen Sie einen Blick auf diese beiden Zeilen:

let cell = tableView.dequeueReusableCell(withIdentifier: "RatingTableViewCell", for: indexPath) as! RatingTableViewCell 
values[indexPath.row] = cell.value 

Sie dequeue eine Zelle, und weisen Sie den Wert auf Werte [indexPath.row]. Die Probleme, die Sie beim Scrollen bemerken, sind auf die Tatsache zurückzuführen, dass die wiederverwendete Zelle zuvor für einen anderen indexPath verwendet wurde, was bedeutet, dass ihr Wert (den Sie den Werten [indexPath.row] zuweisen) für den vorherigen indexPath gedacht ist.

Um das zu beheben, würde ich empfehlen, die Wertvariable in RatingTableViewCell loszuwerden. Definieren Sie stattdessen ein Protokoll RatingTableViewCellDelegate, das verwendet wird, um den RatingViewController über den neuen Wert zu informieren.

+0

i defice Protokoll in Tablecell Klassenprotokoll RatingTableViewCellDelegate { func setCellRating (cell: RatingTableViewCell) } – ava

+0

und Delegatmethode nennen: Überschreiben func awakeFromNib() { super.awakeFromNib() initStarRatingView() starRatingView.addTarget (selbst, Aktion: #selector (DidChangeValue (_ :)), für: .valueChanged) wenn lassen Delegat = self.delegate { delegate.setCellRating (Zelle: Selbst-) } } – ava

+0

Delegat Bedingung nennen nicht – ava

Verwandte Themen