Вместо настройки метода cell
in tableView(_:cellForRowAt:)
вы должны сконфигурировать cell
в самом ArticleTalbeViewCell
, используя модель dataSource
, т.е.
class ArticleTalbeViewCell: UITableViewCell {
private var titlelabel: UILabel?
private var descriptionLabel: UILabel?
//rest of the code...
func configure(with article: Article) {
self.titlelabel?.text = article.title
self.descriptionLabel?.text = article.description
}
}
В приведенном выше коде,
1. Нет необходимости выставлять titlelabel
и descriptionLabel
за пределами class ArticleTalbeViewCell
. Итак, отметьте их обоих private
.
2. Вам просто нужно вызвать метод configure(with:)
вместе с экземпляром Article
.
Почему метод, а не свойство типа Article?
Нет необходимости сохранять объект модели внутри ArticleTalbeViewCell
до тех пор, пока он не потребуется где-то еще после того, как cell
настроен один раз.
В методе tableView(_:cellForRowAt:)
вам нужно просто вызвать метод configure(with:)
для вашего cell
вместе с экземпляром article
в данном конкретном indexPath
.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? ArticleTalbeViewCell else {
fatalError("ArticleTableViewCell not found")
}
let article = self.articleListVM.articleAtIndex(indexPath.row)
cell.configure(with: article)
return cell
}
Кроме того, я не думаю, что есть необходимость создавать отдельный ArticleViewModel
. Это не делает ничего особенного. Это просто дополнительная оболочка на Article
.
Вы можете просто вернуть Article
тип из articleAtIndex(_:)
метода в extension ArticleListViewModel
, т.е.
func articleAtIndex(_ index: Int) -> Article {
let article = self.articles[index]
return article
}
Почему конфигурация в кастоме UITableViewCell
?
Это потому, что ваш tableView
может содержать несколько пользовательских UITableViewCells
. Добавление конфигурации всех cell
в tableView(_:cellForRowAt:)
сделает код здоровенным и не сможет читать. Лучше, если конкретная конфигурация cell
обрабатывается самим cell
вместо ViewController
.