TableViewCell заморожен с пустым массивом dataSource - PullRequest
0 голосов
/ 15 ноября 2018

Я делаю запрос к серверу для выборки данных, затем устанавливаю его данные в свой массив для работы с TableView.

Иногда возникает проблема, когда одна или несколько ячеек замерзают, несмотря на то, что ответ серверамассив empty dataSource также является empty , но ячейки все равно складываются.И все еще на экране, пока я не закрылся.Также изменилось содержимое tableView contentOffset:

enter image description here

На снимке экрана показано замороженное tableViewCell.Но массив dataSource представляет собой пусто , numberOfRowsInSection в секции, также равное 0.

Некоторые детали:

  • tableView.reloadData() вызывается из основного потока;
  • ViewController находится в TabBarViewController;
  • Я проверяю класс объекта моей модели на цикле сохранения, кажется, все в порядке;
  • Я использую xib дляклетка.Ячейка имеет настраиваемый вид содержимого.Все IBOutlets в классе Cell имеют слабые ссылки.

Пожалуйста, помогите мне понять, где я ошибаюсь

РЕДАКТИРОВАТЬ:

extension ViewController: UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        guard let numberOfRowsInSection = items?.count else {
            messageLabel?.text = messageText
            return 0
        }

        return numberOfRowsInSection
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        guard let cell = tableView.dequeueReusableCell(withIdentifier: "Identifier", for: indexPath) as? CustomTableViewCell else { return UITableViewCell() }

        // Cell settings

        return cell

    }
}

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Проблема здесь:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    guard let cell = tableView.dequeueReusableCell(withIdentifier: "Identifier", for: indexPath) as? CustomTableViewCell else { return UITableViewCell() }

    // Cell settings

    return cell

}

Вы возвращаете ячейку, не удалив ее из очереди.

Если вы создаете экземпляр ячейки самостоятельно, TableView не имеет над ней контроля, поэтому он не может повторно использовать ее после обновления источника данных.

Пожалуйста, измените ваш код следующим образом:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "Identifier", for: indexPath) as! CustomTableViewCell

    // Cell settings

    return cell

}

Но также убедитесь, что вы регистрируете ячейку до этого, вероятно, в вашем viewDidLoad.

Что-то вроде:

tableView.register(CustomTableViewCell.self, forCellReuseIdentifier:"Identifier")
0 голосов
/ 15 ноября 2018

Я предполагаю, что вам не хватает метода источника данных

optional func numberOfSections(in tableView: UITableView) -> Int

https://developer.apple.com/documentation/uikit/uitableviewdatasource/1614860-numberofsections

Количество разделов в tableView. Значение по умолчанию: 1.

Это должно нарушить вашу реализацию, когда у вас есть 0 элементов в вашем массиве. Исходя из вашей структуры это может выглядеть как

override func numberOfSections(in tableView: UITableView) -> Int {
    guard let arr = items else { return 0 }
    return arr.count == 0 ? 0 : 1
}
...