2014-10-15 5 views
1

tableViewCell содержит viewController, высота которого вычисляется после того, как tableView завершает выкладку. Поэтому мне нужно вызвать tableView, чтобы запросить снова высоту строк, вызвав метод heightForRowAtIndexPath.Как вызвать tableView heightForRowAtIndexPath после просмотраDidLayoutSubviews вызывается?

Я пробовал setNeedsLayout, он не работает, система не будет звонить heightForRowAtIndexPath метод.

reloadData или reloadRowsAtIndexPaths не является хорошим выбором, потому что это будет перезагружать все клетки, и все viewControllers встроенной в клетки, и еще раз, когда ViewController будет закончен процесс компоновки и viewDidLayoutSubviews называется, reloadData будет вызван снова, так что это является бесконечным циклом.

Я тестировал tableView.beginUpdates() tableView.endUpdates() пустую операцию обновления. Иногда он вызывает heightForRowAtIndexPath, иногда нет.

ответ

0

heightForRowAtIndexPath: является частью протокола UITableViewDelegate и вызывается при выполнении: [tableView reloadData];

setNeedsLayout является метод UIView и вызывает вид перекроить себя, но это не вызовет tableView обновить себя.

+0

если есть только определенные клетки, которые вы хотите обновить, вы можете использовать '(недействительные) reloadRowsAtIndexPaths: (NSArray *) indexPaths withRowAnimation: (UITableViewRowAnimation) animation'. но вам нужно будет вызвать любой из них, если вы хотите изменить высоту своей строки ...:/ – nburk

+0

Можете ли вы показать какой-то код, может быть, это поможет. Если вы запускаете бесконечный цикл, вызывая 'reloadData', это звучит так, как будто у вас может быть проблема с вашим кодом, возможно, я могу помочь :) – nburk

0

Вы можете протестировать setNeedsDisplay в UIView, это приведет к перерисовке представления. Но setNeedsLayout используется для компоновки subviews (позиция и размер). Если перерисовать, размер будет получен от функции делегата.

setNeedsLayout and setNeedsDisplay см

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