Почему методы делегата табличного представления не вызывают? - PullRequest
0 голосов
/ 23 сентября 2019

Я обнаружил, что мое приложение, встроенное в конфигурацию Release , иногда имеет проблему: метод делегата tableView:heightForRowAt: не вызывается.

Эта проблема связана со сборкой, дляв некоторых сборках я всегда воспроизводю проблему, а для некоторых других сборок я никогда не могу воспроизвести ее.

Когда проблема возникает, я вижу, что строки в моем tableView получают все 44 как высоту и точку остановато, что я сделал в методе tableView:heightForRowAt:, никогда не вызывается.

screenshots of normal and buggy result

В моем коде я попытался использовать полиморфизм, чтобы получить 2 разных реализации таблицыпросмотреть источник данных и делегировать методы.Вот упрощенный пример:

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!

    var tableController: BaseTableController!

    let vm = ViewModel(sections: [...])

    override func viewDidLoad() {
        super.viewDidLoad()

        tableController = VariantATableController(viewModel: vm)
        tableView.dataSource = tableController
        tableView.delegate = tableController
    }

}
class BaseTableController: NSObject, UITableViewDataSource, UITableViewDelegate {

    let viewModel: ViewModel

    init(viewModel: ViewModel) {
        self.viewModel = viewModel
        super.init()
    }

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

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return viewModel.sections[section].numberOfRows
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        fatalError("to be overridden")
    }    

}
class VariantATableController: BaseTableController {

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "ACell", for: indexPath)
        let row = viewModel.sections[indexPath.section].rows[indexPath.row]
        cell.textLabel?.text = row.title
        cell.detailTextLabel?.text = row.detail
        return cell
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 120
    }

}
class VariantBTableController: BaseTableController {
    ...
}

Ответы [ 3 ]

0 голосов
/ 23 сентября 2019

Убедитесь, что tableView:heightForRowAt: определен в базовом классе, а не только в производных классах.В противном случае он будет оптимизирован вне сборки выпуска.

0 голосов
/ 23 сентября 2019

Поместите tableView:heightForRowAt: в class BaseTableController: NSObject, UITableViewDataSource, UITableViewDelegate {}.

UITableViewDataSource, UITableViewDelegate необходимо.

0 голосов
/ 23 сентября 2019

В вашем viewDidLoad перед вызовом делегата и источника данных добавьте следующие строки

tableView.rowHeight=UITableViewAutomaticDimension
tableView.estimatedRowHeight=120

и добавьте estimatedHeightForRowAt вместо heightForRowAt

 func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }

Примечание :Для работы с этим вам нужно правильно настроить автоматическое расположение ячейки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...