2017-02-23 1 views
0

Ich habe eine Tabellenansicht, die einige Daten in jeder Zelle anzeigt, wenn die Zelle ausgewählt ist, sollte sie sich erweitern und mehr Daten anzeigen. Ich habe die Grundlagen des Codes, aber wenn die Zelle ausgewählt ist, werden die Daten erst angezeigt, wenn eine andere Zelle ausgewählt ist. Und die Daten scheinen sich bei Auswahl in die anderen Zellen zu duplizieren. Ich bin mir sicher, dass ich nur die Methoden aufrufen muss und obwohl ich denke, dass ich alle Kombinationen ausprobiert habe, kann ich keine Lösung finden. Heres der Code, den ich denke, dass Angelegenheiten:Ansicht hinzufügen und entfernen bei Zellenauswahl

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    let answers = questions[indexPath.row].answers?.allObjects as! [Answer] 
    let cell = tableView.cellForRow(at: indexPath as IndexPath) as! CollectedDataTableViewCell 

    switch selectedIndexPath { 
    case nil: 
     cell.contentView.viewWithTag(indexPath.row + 1)?.removeFromSuperview() 
     selectedIndexPath = indexPath as NSIndexPath? 
    default: 
     if selectedIndexPath! as IndexPath == indexPath { 
      addAnswerViews(cell: cell, answers: answers, index: indexPath.row + 1) 
      selectedIndexPath = nil 
     } else { 
      cell.contentView.viewWithTag(indexPath.row + 1)?.removeFromSuperview() 
      selectedIndexPath = indexPath as NSIndexPath? 
     } 
    } 

    tableView.reloadRows(at: [indexPath as IndexPath], with: UITableViewRowAnimation.automatic) 

    self.tableView.scrollToRow(at: indexPath, at: .top, animated: true) 
} 

func addAnswerViews(cell: CollectedDataTableViewCell, answers: [Answer], index: Int) { 

    var extra = CGFloat(0) 
    var percentage: Double = 0 

    let percentFormatter = NumberFormatter() 

    percentFormatter.numberStyle = .percent 
    percentFormatter.multiplier = 100 
    percentFormatter.minimumFractionDigits = 1 
    percentFormatter.maximumFractionDigits = 2 

    answers.forEach { answer in 
     let height = self.height - 6 
     let width = cell.contentView.frame.width 
     let view = UIView(frame: CGRect(x: 0, y: height + extra, width: width, height: height)) 
     view.tag = index 

     let answerLabel = UILabel(frame: CGRect(x: 15, y: 0, width: width - 30, height: height/2)) 
     answerLabel.backgroundColor = .clear 
     answerLabel.adjustsFontSizeToFitWidth = true 
     answerLabel.text = answer.text 

     if answer.timesSelected == 0 || answer.timesSelectedCorrectly == 0 { 

      percentage = 0 
     } else { 

      percentage = Double(answer.timesSelectedCorrectly)/Double(answer.timesSelected) 
     } 

     var percentString = percentFormatter.string(from: NSNumber(value: percentage)) 
     if percentage == 1.0 { percentString = "100%"} 
     if percentage == 0.0 { percentString = "0%" } 

     let timesSelectedCorrectlyLabel = UILabel(frame: CGRect(x: 15, y: height/2, width: width/2 - 15, height: height/2)) 
     timesSelectedCorrectlyLabel.backgroundColor = .clear 
     timesSelectedCorrectlyLabel.adjustsFontSizeToFitWidth = true 
     timesSelectedCorrectlyLabel.text = "Times selected correctly: \(answer.timesSelectedCorrectly) - \(percentString!)" 

     let timesSelectedLabel = UILabel(frame: CGRect(x: width/2 - 15, y: height/2, width: width/2 - 15, height: height/2)) 
     timesSelectedLabel.backgroundColor = .clear 
     timesSelectedLabel.adjustsFontSizeToFitWidth = true 
     timesSelectedLabel.text = "Times selected: \(answer.timesSelected)" 

     view.addSubview(answerLabel) 
     view.addSubview(timesSelectedCorrectlyLabel) 
     view.addSubview(timesSelectedLabel) 

     cell.contentView.addSubview(view) 
     extra += height 
    } 
} 
+0

Sie haben UITableView Abschnitt neu zu laden, erweitern die, die Sie wollen. – iParesh

+0

im dies auf der vorletzten Zeile in didSelectRow tun – Wazza

+0

Darüber hinaus müssen Sie => einstellen func Tableview (_ Tableview: UITableView, Abschnitt numberOfRowsInSection: Int) -> Int { return elements.count } – iParesh

Antwort

2

Ihre DidSelectRowAtIndexPath ändern, wie unten :)

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    let answers = questions[indexPath.row].answers?.allObjects as! [Answer] 
    let cell = tableView.cellForRow(at: indexPath as IndexPath) as! CollectedDataTableViewCell 

    if self.previouslySelectedIndexPath != nil { 
     cell.contentView.viewWithTag(previouslySelectedIndexPath.row + 1)?.removeFromSuperview() 
    } 
    addAnswerViews(cell: cell, answers: answers, index: indexPath.row + 1) 

    if self.previouslySelectedIndexPath != nil { 
     tableView.reloadRows(at: [indexPath,self.previouslySelectedIndexPath], with: UITableViewRowAnimation.automatic) 
    } 
    else { 
     tableView.reloadRows(at: [indexPath as IndexPath], with: UITableViewRowAnimation.automatic) 
    } 
    self.previouslySelectedIndexPath = indexPath 
    self.tableView.scrollToRow(at: indexPath, at: .top, animated: true) 
} 
+0

ich habe nicht eine ‚previouslySelectedIndexPath 'sollte ich es auf Null setzen, wenn es initialisiert wird? – Wazza

+0

Deklarieren Sie eine Variable als var previousSelectedIndexPath: IndexPath? = nil –

+0

Ich habe das gerade gemacht und bekomme einen Fehler, wenn ich eine Zelle auswähle, weil 'reviousSelectedIndexPath' bei' tableView.ReloadRows (at: [indexPath, self.previouslySelectedIndexPath als! IndexPath], mit: UITableViewRowAnimation.automatic) null ist ' – Wazza

Verwandte Themen