UITableView reloadRowsAtIndexPaths постоянно перезагружает ячейку

75
3

У меня есть UITableView с пользовательской ячейкой, содержащей UIWebView. Я пытаюсь перезагрузить ячейку с правильной высотой после того, как веб-просмотр завершит загрузку содержимого html.

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
height = tableView.frame.size.height - tableView.contentSize.height
return height
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell:UITableViewCell!
cell = tableView.dequeueReusableCellWithIdentifier("bodyFieldCellIdentifier", forIndexPath: indexPath)
(cell as! SMBodyTableViewCell).frame = CGRect(x: 0, y: 0, width: width, height: height)
(cell as! SMBodyTableViewCell).bodyWebView.delegate = self
(cell as! SMBodyTableViewCell).bodyWebView.loadHTMLString(self.messageBody, baseURL: nil)
(cell as! SMBodyTableViewCell).bodyWebView.tag = indexPath.row
}

В методе делегирования webViewDidFinishLoad я пытаюсь перезагрузить ячейку, содержащую webview.

func webViewDidFinishLoad(aWebView: UIWebView) {
let indexPath = NSIndexPath(forRow: aWebView.tag, inSection: 0)
self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
}

Когда я запускаю приложение, ячейка, содержащая веб-просмотр, постоянно перезагружается. Высота кажется правильной и по желанию, но вы можете видеть перезагрузку ячеек без остановок. Я не могу понять, почему он постоянно перезагружается. Содержимое HTML, которое я загружаю, является простым HTML и не имеет нескольких/бесконечных фреймов, поэтому webViewDidFinishLoad постоянно вызывается. Я также попытался пересчитать и установить высоту ячейки в webViewDidLoad, но высота, похоже, не рассчитана правильно.

спросил(а) 2021-01-19T17:31:53+03:00 2 месяца, 3 недели назад
1
Решение
97

Ну, конечно, он постоянно перезагружается. Это то, что вы написали.

Каждый раз, когда вы загружаете ячейку, вы запускаете веб-представление внутри ячейки для загрузки. Когда загрузка завершается, она вызывает webViewDidFinishLoad, где вы запускаете перезагрузку той же самой ячейки. Затем он вызывает cellForRowAtIndexPath, который запускает веб-просмотр для загрузки AGAIN. И так далее.

Вам не нужен вызов для reloadRowsAtIndexPaths в вашем webViewDidFinishLoad. Веб-просмотр должен автоматически обновлять его содержимое, не делая ничего.

ответил(а) 2021-01-19T17:31:53+03:00 2 месяца, 3 недели назад
44

когда webViewDidFinishLoad вы можете получить высоту с помощью webview.scrollView.contentSize.height, затем вызовите reloadRowsAtIndexPaths

ответил(а) 2021-01-19T17:31:53+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема