Метод UITableView cellForRowAt не выполняется

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 на раскадровке соответственно подключены к моему коду. Я не вижу причин, почему он не загружает данные.

Вы установили делегатов в viewDidLoad()? tableView.delegate = сам tableView.dataSource = сам

Noman Umar 08.11.2022 08:58

@NomanUmar Да, уже сделал это, но вообще не работает.

Ahmed AlFailakawi 08.11.2022 08:59

если numberOfRowsInSection > 0 & numberOfSections >= 1, я бы дважды проверил ваши ограничения. В качестве попытки вы можете добавить tableView.rowHeight = 50 в свои настройки и посмотреть, будет ли она вызываться.

alessandro_minopoli 08.11.2022 11:52

@AhmedAlFailakawi Если проблема заключалась в возврате 0 необработанных данных в numberOfRowsInSection или 0 разделов в numberOfSections, и вы нашли свою ошибку и проблема решена - пожалуйста, закройте свой вопрос.

Dmytro Yashchenko 08.11.2022 13:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
73
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Подтвердите, что 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 вообще не выполняется.
Ahmed AlFailakawi 08.11.2022 09:17

Выполняется ли функция numberOfRowsInSection? Если да, то какой номер возвращается?

Anish 08.11.2022 09:21

число строк в разделе = 0

Ahmed AlFailakawi 08.11.2022 09:27

Упс... Вот почему ячейки не загружаются.... Добавьте какое-нибудь жестко запрограммированное значение, например, return 5 & test, чтобы ячейки могли загружаться. И отладьте это утверждение «вернуть self.articleListVM == nil ? 0: self.articleListVM.numberOfSections». Это должно решить вашу проблему. :)

Anish 08.11.2022 10:26

Видите ли, я создал аналогичный проект, он был точно таким же и код идентичный. Основное отличие состоит в том, что здесь используется другая сетевая библиотека. При отладке этого другого проекта numberOfSections = 0 без проблем, и он отлично отображает все ячейки данных. Почему это может быть проблемой?

Ahmed AlFailakawi 08.11.2022 10:38

Вы путаетесь между numberOfSections=0 и numberOfRowsInSection=0. Не имеет значения, если numberOfSections = 0, но для того, чтобы ячейки в таблице numberOfRowsInSection должны быть больше 0. Вы можете попробовать жестко закодировать значение для numberOfRowsInSection и добавить точку останова в cellForRowAt indexPath для проверки... :)

Anish 08.11.2022 10:44

О Боже, мне так стыдно. numberOfRowsInSection = 20, а не ноль. Моя ошибка. Итак, я думаю, теперь проблема не связана с numberOfRowsInSection.

Ahmed AlFailakawi 08.11.2022 10:48

Как вы выложили представления, программно или через раскадровку?

Если это делается через раскадровку:

  1. Убедитесь, что IBOutlet правильно подключен (проверьте на наличие опечаток и т. д.), назначить делегата и источник данных для табличных представлений и соответствовать протоколы.

Если сделать программно:

  1. Убедитесь, что вы установили делегата и источника данных перед звоню tableView.reloadData()

    tableView.dataSource = self
    tableView.delegate = self
    

Я создал его через раскадровку, и это кажется прекрасным. Источник данных и делегат правильно подключены к IBOutlets.

Ahmed AlFailakawi 08.11.2022 09:35
Ответ принят как подходящий

Моя основная проблема была с глобальной переменной newtworkManager И как вы можете видеть в коде:

newtworkManager?.getNews {...}

Решение заключалось в том, что я удалил эту глобальную переменную и заменил ее следующей:

NetworkManager().getNews { ...}

После этого метод cellForRowAt работал нормально, и ячейки данных отображались в UITableView.

Другие вопросы по теме