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
}
}
Sie haben UITableView Abschnitt neu zu laden, erweitern die, die Sie wollen. – iParesh
im dies auf der vorletzten Zeile in didSelectRow tun – Wazza
Darüber hinaus müssen Sie => einstellen func Tableview (_ Tableview: UITableView, Abschnitt numberOfRowsInSection: Int) -> Int { return elements.count } – iParesh