2016-09-23 39 views
1

Ich versuche, eine Stapelansicht in einer Tabellenansicht Zelle programmatisch zu implementieren und fügen Sie Etiketten und Tasten, um es wie so:Stapelansicht in einer Tabellenansicht Zelle

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 
    let dict = self.char[indexPath.row] 
    let stackView = UIStackView() 
    stackView.translatesAutoresizingMaskIntoConstraints = false 
    stackView.axis = .horizontal 
    stackView.spacing = 20 
    stackView.distribution = .fillProportionally 
    stackView.alignment = .leading 
    cell.addSubview(stackView) 
    NSLayoutConstraint.activate([ 
     stackView.leadingAnchor.constraint(equalTo: cell.leadingAnchor), 
     stackView.trailingAnchor.constraint(equalTo: cell.trailingAnchor) 
     ]) 
    let bornLabel = UILabel() 
    bornLabel.textColor = UIColor.blue 
    let bornLabelValue = UILabel() 
    bornLabelValue.textColor = UIColor.blue 
    stackView.addArrangedSubview(bornLabel) 
    stackView.addArrangedSubview(bornLabelValue) 
    for (key, value) in dict { 
     bornLabel.text = key 
     bornLabelValue.text = value 
     if key == "Height" { 
      let button = UIButton(type: .roundedRect) 
      button.setTitle("English", for: .normal) 
      button.setTitleColor(.blue, for: .normal) 
     stackView.addArrangedSubview(button) 
     } 
    } 
    return cell 
} 

Das Problem ist, dass jedes Mal, tableView.reloadData() genannt wird Je nach den Daten, die der TabelleView übergeben werden, wird für jede Beschriftung eine weitere Zelle über der vorhandenen Zelle mit unterschiedlichen Werten hinzugefügt. Oder es erzeugt nicht jedes Mal eine andere Zelle, sondern fügt einfach eine weitere Stapelansicht hinzu. Ich bin mir nicht sicher. Wie kann ich das beheben?

Dank

Antwort

2

Das Problem ist, dass Sie eine „wiederverwendbare Zelle“, wenn es darum, das heißt, es wird die ersten paar Male eine leere Zelle sein, und dann wird es eine Zelle, wo man schon sein fügte eine UIStackView hinzu.

Sie sollten eine neue Prototyp-Zelle machen, entweder über die Storyboard oder eine neue XIB Datei, die UIStackView in ihm hinzuzufügen, und auch dann nur, dass stackView in Ihrer cellForRowAt indexPath: Implementierung konfigurieren.

Oder Sie könnten technisch ein Tag in der StackView setzen, und überprüfen Sie dann die Zelle für dieses Tag ... aber bitte tun Sie dies nicht.

+1

Ihre Antwort führte mich an den richtigen Ort, danke. Ich löste es, indem ich tatsächlich eine Prototypzelle verwendete, eine Stapelansicht hinzufügte und diese Stapelansicht in 'cellForRowAt indexPath:' konfigurierte. Ich hatte das schon mal probiert und meine Labels und Buttons auch in 'cellForRowAt indexPath:' instanziiert und nicht in meiner benutzerdefinierten Cell-Klasse, die jetzt einwandfrei funktioniert. Vielen Dank! – user2747220

1

Versuchen Sie, die stackView im cell.contentView

Ich bin Ziel-C Person hinzufügen haben noch swift so nicht gelernt.

In Objectiv C überprüfen wir den Zustand, ob die Zelle null oder nicht vor Instantiierung ist.

ex.

if(cell == nil) 
{ 
    # Instantiate cell here 
} 

von dieser Zelle wird nicht für jede Zeile von IndexPath instanziiert.

Verwandte Themen