extension ArticlesViewController {
func setup() {
self.navigationController?.navigationBar.prefersLargeTitles = true
newtworkManager?.getNews { [weak self] (results) in
switch results {
case .success(let data):
self?.articleListVM = ArticleListViewModel(articles: data.article!)
// For testing
print(self?.articleListVM.articles as Any)
DispatchQueue.main.async {
self?.tableView.reloadData()
}
case .failure(let error):
print(error.localizedDescription)
}
}
}
Теперь, во время отладки, я успешно получаю данные и распечатываю их. Однако я понял, что функция cellForRowAt не выполняется, что приводит к тому, что данные не отображаются в таблице. Я не вижу никаких проблем, но время выполнения, конечно, не соответствует.
extension ArticlesViewController {
override func numberOfSections(in tableView: UITableView) -> Int {
return self.articleListVM == nil ? 0 : self.articleListVM.numberOfSections
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.articleListVM.numberOfRowsInSection(section)
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "ArticleTableViewCell", for: indexPath) as? ArticleTableViewCell else {
fatalError("ArticleTableViewCell not found")
}
let articleVM = self.articleListVM.articleAtIndex(indexPath.row)
cell.titleLabel.text = articleVM.title
cell.abstractLabel.text = articleVM.abstract
return cell
}
}
Как вы думаете, почему этот метод не срабатывает? Обратите внимание, что мои UITableView и UITableViewCell на раскадровке соответственно подключены к моему коду. Я не вижу причин, почему он не загружает данные.
@NomanUmar Да, уже сделал это, но вообще не работает.
если numberOfRowsInSection > 0 & numberOfSections >= 1, я бы дважды проверил ваши ограничения. В качестве попытки вы можете добавить tableView.rowHeight = 50 в свои настройки и посмотреть, будет ли она вызываться.
@AhmedAlFailakawi Если проблема заключалась в возврате 0 необработанных данных в numberOfRowsInSection или 0 разделов в numberOfSections, и вы нашли свою ошибку и проблема решена - пожалуйста, закройте свой вопрос.





Подтвердите, что ArticlesViewController использует протокол UITableViewDelegate и UITableViewDataSource, и удалите переопределение функций. Пример:
extension ArticlesViewController: UITableViewDelegate, UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return self.articleListVM == nil ? 0 : self.articleListVM.numberOfSections
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
....
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
....
}
}
Также убедитесь, что вы подключили свое табличное представление через раскадровку/код.
tableView.dataSource = self
tableView.delegate = self
ArticlesViewController — это UITableViewController, который уже соответствует обоим протоколам UITableViewDelegate, UITableViewDataSource. Выполняя дополнительную отладку, я заметил, что cellForRowAt вообще не выполняется.
Выполняется ли функция numberOfRowsInSection? Если да, то какой номер возвращается?
число строк в разделе = 0
Упс... Вот почему ячейки не загружаются.... Добавьте какое-нибудь жестко запрограммированное значение, например, return 5 & test, чтобы ячейки могли загружаться. И отладьте это утверждение «вернуть self.articleListVM == nil ? 0: self.articleListVM.numberOfSections». Это должно решить вашу проблему. :)
Видите ли, я создал аналогичный проект, он был точно таким же и код идентичный. Основное отличие состоит в том, что здесь используется другая сетевая библиотека. При отладке этого другого проекта numberOfSections = 0 без проблем, и он отлично отображает все ячейки данных. Почему это может быть проблемой?
Вы путаетесь между numberOfSections=0 и numberOfRowsInSection=0. Не имеет значения, если numberOfSections = 0, но для того, чтобы ячейки в таблице numberOfRowsInSection должны быть больше 0. Вы можете попробовать жестко закодировать значение для numberOfRowsInSection и добавить точку останова в cellForRowAt indexPath для проверки... :)
О Боже, мне так стыдно. numberOfRowsInSection = 20, а не ноль. Моя ошибка. Итак, я думаю, теперь проблема не связана с numberOfRowsInSection.
Как вы выложили представления, программно или через раскадровку?
Если это делается через раскадровку:
Если сделать программно:
Убедитесь, что вы установили делегата и источника данных перед
звоню tableView.reloadData()
tableView.dataSource = self
tableView.delegate = self
Я создал его через раскадровку, и это кажется прекрасным. Источник данных и делегат правильно подключены к IBOutlets.
Моя основная проблема была с глобальной переменной newtworkManager И как вы можете видеть в коде:
newtworkManager?.getNews {...}
Решение заключалось в том, что я удалил эту глобальную переменную и заменил ее следующей:
NetworkManager().getNews { ...}
После этого метод cellForRowAt работал нормально, и ячейки данных отображались в UITableView.
Вы установили делегатов в viewDidLoad()? tableView.delegate = сам tableView.dataSource = сам