Я обнаружил, что мое приложение, встроенное в конфигурацию Release , иногда имеет проблему: метод делегата tableView:heightForRowAt:
не вызывается.
Эта проблема связана со сборкой, дляв некоторых сборках я всегда воспроизводю проблему, а для некоторых других сборок я никогда не могу воспроизвести ее.
Когда проблема возникает, я вижу, что строки в моем tableView получают все 44 как высоту и точку остановато, что я сделал в методе tableView:heightForRowAt:
, никогда не вызывается.
![screenshots of normal and buggy result](https://i.stack.imgur.com/dGMOB.png)
В моем коде я попытался использовать полиморфизм, чтобы получить 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 {
...
}