2016-07-13 2 views
1

Как мой текущий проект работает, я деактивирую ячейку и даю ей идентификатор истории. В ячейке initWithStyle создаю mysubView (UILabel), установите ограничения autolayout и запустите API запрос, который загружает заголовок истории async. Затем я установил текст для UILabel.Как обновить heightForRow от UITableViewCell

Проблема в том, что в этой точке UITableViewController уже рассчитал неправильную высоту для ячейки, потому что изначально UILabel не имеет text. Единственный способ, как обновить его сейчас, делая

parentTableView.beginUpdates 
parentTableView.endUpdates 

Но он чувствует себя не так, потому что мне нужно ссылаться на родительском UITableView внутри клетки и там должен быть лучшим способом. Я что-то упускаю? Я использую UITableViewAutomaticDimension, кстати, для высоты строки.

+0

Вы настроены на оценку RowHeight? –

+0

Да, я его установил. – egze

+0

где вы устанавливаете оценочный рейтинг RowHeight? в моем случае я установил self.view_tableView.estimatedRowHeight = 300; self.view_tableView.rowHeight = UITableViewAutomaticDimension; in viewDidLoad и перезагрузить таблицу после вызова api. –

ответ

1

Я предлагаю вам посмотреть Session 211 о WWDC 2012, Построение Одновременные пользовательских интерфейсов и применять концепции там. В нем представлены ячейки, содержимое которых независимо запрашивается и визуализируется.

Основная концепция заключается в следующем:
1. В tableView:cellForRowAtIndexPath создается экземпляр ячейки.
2. В этом же способе создается и хранится операция для извлечения данных для заполнения ячейки. Ссылка на ячейку передается операции. Операция имеет обработчик завершения, который заполняет ячейку и удаляет операцию из словаря.
3. Прежде чем ячейка будет возвращена из метода, операция будет добавлена ​​в очередь операций.
4. В tableView:didEndDisplayingCell:forRowAtIndexPath операции для ячеек, которые переместились за пределы экрана, отменены и удалены из словаря.

+0

Это звучит очень многообещающе. Благодаря! – egze

0

Добавить следующий код в метод cellForRowAtIndexPath перед возвратной ячейкой.

cell.setNeedsUpdateConstraints() cell.updateConstraintsIfNeeded()

также можно использовать только "updateConstraintsIfneeded"

+0

Это не сработает, потому что на этом этапе рано обновлять ограничения. Ячейка возвращается, но текст для метки внутри него загружается вызовом REST через секунду. – egze

+0

Так что используйте динамическую функцию, например heightForView, и вызывайте cellForRowAtIndexPath как. функ heightForView (текст: String, LBL: UILabel) -> CGFloat { пусть mylbl: UILabel = UILabel (рама: lbl.frame) mylbl.numberOfLines = 0 mylbl.lineBreakMode = NSLineBreakMode.ByWordWrapping mylbl.font = lbl.font mylbl.text = текст mylbl.sizeToFit() возвращение mylbl.frame.height } на сотовом heightForView (cell.yourlabel.text !, LBL: cell.yourlabel) +75) –

+0

к сожалению , вам не хватает точки, что во время вызова этого метода текст еще недоступен, поэтому я не могу рассчитать высоту. Но когда текст наконец-то там - высота уже ошибочна. Мне неизвестно, когда наконец появится текст для лейбла. – egze

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

  • Нет связанных вопросов^_^