2017-01-20 4 views
0

Sichtbarmachen habe ich einen Viewcontroller mit einem tableview, die mit UITableViewAutomaticDimension rowHeight Objekt ist:Zelle mit stackview expandiert nicht, wenn ein Teil der stackview

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    private var items: [String] = [] 

    @IBOutlet weak var tableView: UITableView! 

    // MARK: - UITableViewDataSource, UITableViewDelegate 

    func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return self.items.count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell") as! CustomTableViewCell 
     cell.expandButton.setTitle(self.items[indexPath.row], for: .normal) 
     return cell 
    } 

    // MARK: - View cycle 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     items = [ 
      "Allen","Upton","Hu","Yuli","Tiger","Flynn","Lev","Kyle","Sylvester","Mohammad", 
      "Harlan","Julian","Sebastian","Porter","Preston","Palmer","Jakeem","Micah","Stephen","Tucker" 
     ] 

     self.tableView.estimatedRowHeight = 150 
     self.tableView.rowHeight = UITableViewAutomaticDimension 
    } 

} 

Die Schnittstelle in IB wird wie folgt definiert. Es hat eine benutzerdefinierte Zelle. Die Zelle enthält eine Stapelansicht. Im oberen Teil dieses Stackview gibt es einen Button und im unteren Teil ein Textfeld. Das Textfeld ist zunächst auf Versteckt gesetzt.

UITableView with prototype cell containing stackview

die Taste tippen, wird das Textfeld sichtbar machen. Die Zelle jedoch nicht erweitern nicht:

Screenshot of iOS Simulator

wird erwartet, dass die Zelle die ganze stackview angezeigt werden kann. Warum funktioniert das nicht?

(ich habe es bekommen durch Neuladen der Zelle zu arbeiten, aber dies ist eine hässliche Abhilfe, den Code in dem Viewcontroller benötigt.)

Projekt auf Github: https://github.com/bvankuik/TestResizingCell

Antwort

1

Ich habe das Problem wie folgt "behoben". Im Viewcontroller vergewissere ich mich, ob eine Zeile ihr Textfeld versteckt oder sichtbar hat. Ich habe die Schaltfläche entfernt und verwende einfach didSelectRowAt. Das lädt die Zelle:

struct NameCellData { 
    var name: String 
    var isTextFieldHidden: Bool 
} 

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    private var items: [NameCellData] = [] 

    @IBOutlet weak var tableView: UITableView! 

    // MARK: - UITableViewDataSource, UITableViewDelegate 

    func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return self.items.count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell") as! CustomTableViewCell 
     cell.nameLabel.text = self.items[indexPath.row].name 
     cell.nameCorrectionTextField.isHidden = self.items[indexPath.row].isTextFieldHidden 
     return cell 
    } 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     self.items[indexPath.row].isTextFieldHidden = !self.items[indexPath.row].isTextFieldHidden 
     tableView.reloadRows(at: [indexPath], with: .automatic) 
    } 

    // MARK: - View cycle 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let names = [ 
      "Allen","Upton","Hu","Yuli","Tiger","Flynn","Lev","Kyle","Sylvester","Mohammad", 
      "Harlan","Julian","Sebastian","Porter","Preston","Palmer","Jakeem","Micah","Stephen","Tucker" 
     ] 
     for name in names { 
      let nameCellData = NameCellData(name: name, isTextFieldHidden: true) 
      items.append(nameCellData) 
     } 

     self.tableView.estimatedRowHeight = 150 
     self.tableView.rowHeight = UITableViewAutomaticDimension 
    } 

} 

Für die vollständigen Code finden Zweig des ursprünglichen Testprojekt auf Github: https://github.com/bvankuik/TestResizingCell/tree/withReload

0

Leider Selbst Sizing Zellen Höhe ändert sich nicht automatisch, wenn Sie Einschränkungen in ihnen ändern. Wenn Sie Tableview in erzeugt, die Delegierten Methoden Aufruf: numberOfSections, numberOfRowsInSection, cellForRowAt, etc ...

Es ist der Fall auch für tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath). Wenn Sie also nach dem Ändern einer Integritätsregel in einer Zelle Ihre tableView nicht neu laden, werden die Methoden dieser Delegierten nicht aufgerufen, und Ihre Zeilenhöhen werden nicht erneut vom automatischen Layout berechnet.

Der beste Vorschlag, den ich haben könnte, anstatt das TableView neu zu laden, ist, cell.layoutIfNeeded() direkt nach dem Zeigen des Textfeldes zu benennen.

+0

Ist cell.layoutIfNeeded() als Lösung gemeint? Wo schlägst du vor, dass ich diese Linie setze? –

Verwandte Themen