2017-01-20 7 views
0

У меня есть ViewController с Tableview, что с RowHeight набор свойств для UITableViewAutomaticDimension:клеток с stackview не расширяется, когда часть восстановления скрытого 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 
    } 

} 

Интерфейс определяется в IB следующим образом. У него есть пользовательская ячейка. Ячейка содержит стек. В верхней части этого stackview есть кнопка, а в нижней части - текстовое поле. Первоначально текстовое поле установлено на скрытое.

UITableView with prototype cell containing stackview

Нажатие кнопки отобразите текстовое поле. Клетка однако, не расширяется:

Screenshot of iOS Simulator

Ожидаемый является то, что клетка расширяется, чтобы показать всю stackview. Почему это не работает?

(я получил его на работу путем перезагрузки ячейки, но это некрасиво обходной путь, который требует код в ViewController.)

Проект Github: https://github.com/bvankuik/TestResizingCell

ответ

1

Я «исправил» проблему следующим образом. В viewcontroller я утверждаю, что строка имеет скрытое или видимое текстовое поле. Я удалил кнопку и просто использовал didSelectRowAt. Это перегружает клетку:

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 
    } 

} 

Для полного кода, см ветви исходного тестового проекта на Github: https://github.com/bvankuik/TestResizingCell/tree/withReload

0

К сожалению, само проклейки клетки высота автоматически не изменяется при изменении ограничений внутри них. Когда вы Tableview в порождена, методы делегата являются вызовом: numberOfSections, numberOfRowsInSection, cellForRowAt и т.д ...

Это случай для tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath), а также. Это означает, что если вы не перезагружаете tableView после изменения ограничения в ячейке, эти методы делегата не вызываются, а высоты ваших строк не вычисляются автоматически автоматически.

Лучшее предложение, которое я мог бы использовать вместо перезагрузки tableView, - это позвонить cell.layoutIfNeeded() сразу после отображения текстового поля.

+0

ли cell.layoutIfNeeded() означает, как решение? Где вы предлагаете мне поставить эту линию? –

Смежные вопросы