Перезагрузить строку UITableView после загрузки изображения (с помощью MVVM)

В приложении, которое я пишу, я решил использовать шаблон MVVM. Я привязываю ViewModels к Views, используя RxSwift + RxCocoa. Теперь столкнулся с проблемой, сам не могу найти решения.

У меня есть список ViewModels, которые я хочу отобразить в UITableView. В методе tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) я удаляю ячейку из очереди и привязываю одну из ViewModels из списка к этой ячейке. ViewModel имеет переменную imageUrl, и я использую Kingfisher, чтобы загрузить это изображение и поместить его в ImageView в этой ячейке.

Итак, вот моя проблема: когда загрузка завершена, мне нужно перезагрузить эту строку, чтобы Auto Layout вычислил ее правильную высоту. Но когда я использую tableView.reloadRows(at: [indexPath], with: .none), привязка воссоздается и заканчивается бесконечным циклом (привязка -> обратный вызов завершения загрузки изображения -> перезагрузить строку -> привязка -> ...)!

Любые идеи, как обойти это?


person Tiero    schedule 29.08.2017    source источник
comment
Поделитесь кодом пожалуйста!   -  person Lorenzo B    schedule 29.08.2017


Ответы (1)


Вам не нужно перезагружать строку для автомакета, чтобы вычислить высоту (на самом деле, никогда не делайте этого). Настройте свое табличное представление, чтобы оно имело адаптивную высоту, и все готово.

Вы можете найти хороший пример этого на https://www.raywenderlich.com/129059/self-sizing-table-view-cells

person thibaut noah    schedule 29.08.2017
comment
Привет. К сожалению, это неправда. При отображении строки с изображением и загрузке изображения ничего не происходит. Мне нужно прокрутить эту строку с экрана и снова прокрутить ее - тогда изображение отображается правильно. - person Tiero; 30.08.2017
comment
@Tiero, это правда, у меня есть огромный проект с представлением коллекции, отображающим изображения для всех элементов, и мы никогда не перезагружаем строку. Если изображение не отображается, это означает, что ваш код неверен. - person thibaut noah; 30.08.2017
comment
Итак, как вы ограничиваете свой ImageView, чтобы заставить его работать? - person Tiero; 30.08.2017
comment
Ты не проектировал свои клетки? - person thibaut noah; 30.08.2017
comment
Простой пример: ImageView внутри UITableViewCell. Теперь iv = ImageView, con = ContentView этой ячейки. Я ограничиваю iv.leadin = con.leading, iv.trailing = con.trailing, iv.top = con.top, iv.bottom = con.bottom. Итак, в основном ImageView покрывает всю ячейку. Я хочу, чтобы высота ячейки адаптировалась к высоте ImageView. Когда изображение загружается во время отображения ячейки, ничего не происходит. Мне нужно прокрутить вверх/вниз, а затем снова вниз/вверх, чтобы он появился. - person Tiero; 30.08.2017
comment
И это потому, что ваш код неверен. Автомакет и адаптивная высота, читайте туториалы по этому поводу и все получится. - person thibaut noah; 30.08.2017