TableViewCell被空的dataSource数组冻结

时间:2018-11-15 09:32:40

标签: ios swift xcode xib nib

我向服务器请求获取数据,然后将其数据设置到我的数组中以处理TableView。

有时一个问题或一个问题是,尽管服务器响应是一个数据源数组也是一个,但是一个单元格或几个单元格被冻结,但是单元格仍会堆叠。直到我关闭为止,它仍然在屏幕上。另外tableView contentOffset也被更改:

enter image description here

  

该屏幕截图显示了冻结的tableViewCell。但是dataSource数组的部分为 numberOfRowsInSection 也等于0。

一些细节:

    从主线程调用
  • tableView.reloadData()
  • ViewController位于TabBarViewController中;
  • 我在保持周期上检查了地雷模型对象类,看来一切都很好;
  • 我将xib用于牢房。该单元具有一个自定义内容视图。 Cell类中的所有IBOutlet引用都很弱。

请帮我了解我错了

编辑:

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 :(得分:0)

我的猜测是您缺少数据源方法

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
}

答案 1 :(得分:0)

问题在这里:

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中是registering之前的单元格。

类似:

tableView.register(CustomTableViewCell.self, forCellReuseIdentifier:"Identifier")