ios - 正在更新的单元格多于表中存在的单元格数?

标签 ios swift uitableview uiscrollview

我对我的 Swift 中看似简单的问题感到困惑iOS 应用程序。我要做的是显示 100 cells 的列表在tableview每个cell说“ Hello World ”。

cellForRowAt:内我通过在 background thread 上实现 2 秒的 sleep 调用来模拟网络调用。 .模拟网络调用完成后,我更新了 table view cell以便文本以粗体显示。

我这里有两个问题:

1) 滚动看起来有点不稳定。你如何解决这个问题?

2) 当我启动应用程序时,如果我 scroll真的很快到了列表的末尾,我看到更新了 100 多个单元格(即查看 cellForRowAt 中的打印语句)。但是如果我从上到下慢慢滚​​动,我会看到 100 cells更新。为什么会这样?

这是主要的ViewController.swift文件:

import UIKit

final class ViewController: UIViewController {

    // MARK: - Variables
    private var cellsUpdated: Int = 0
    private let fontSize17: CGFloat = 17
    private let tableview: UITableView = {
        let tv = UITableView()
        tv.backgroundColor = UIColor.white
        tv.translatesAutoresizingMaskIntoConstraints = false
        return tv
    }()
    private var reuseIdentifier: String = "cell"
    private var sampleData = [TableData]()

    // MARK: - View Life Cycle Methods
    override func viewDidLoad() {
        super.viewDidLoad()
        populateDataSet()
        setupTableView()
    }

    // MARK: - Custom Methods
    private func populateDataSet(){

        (0..<100).forEach { (_) in
            sampleData.append(TableData(value: "Hello World", hasBeenViewed: false))
        }
    }

    private func setupTableView(){

        self.tableview.register(UITableViewCell.self, forCellReuseIdentifier: reuseIdentifier)
        self.tableview.delegate = self
        self.tableview.dataSource = self
        view.addSubview(tableview)
        NSLayoutConstraint.activate([
            tableview.topAnchor.constraint(equalTo: self.view.topAnchor),
            tableview.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
            tableview.rightAnchor.constraint(equalTo: self.view.rightAnchor),
            tableview.leftAnchor.constraint(equalTo: self.view.leftAnchor)
        ])
    }
}

extension ViewController: UITableViewDataSource, UITableViewDelegate
{
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath)
        cell.textLabel?.text = self.sampleData[indexPath.row].value
        cell.textLabel?.font = UIFont.systemFont(ofSize: fontSize17)
        if !self.sampleData[indexPath.row].hasBeenViewed {
            cell.textLabel?.font = UIFont.systemFont(ofSize: fontSize17)
            DispatchQueue.global(qos: .userInteractive).async {
                // Simulate the execution of a CPU time intensive task on the background thread
                sleep(2)
                self.sampleData[indexPath.row].hasBeenViewed = true
                DispatchQueue.main.async {
                    // Update the table cells on the main thread
                    cell.textLabel?.font = UIFont.boldSystemFont(ofSize: self.fontSize17)
                    self.cellsUpdated += 1
                    print("\(self.cellsUpdated) cells have been updated")
                }
            }
        } else {
            cell.textLabel?.font = UIFont.boldSystemFont(ofSize: fontSize17)
        }
        return cell
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return sampleData.count
    }
}

此文件引用了一个名为 TableData 的类这只是一个简单的类:

final class TableData {
    // MARK: - Internal Instance Variables
    var value: String
    var hasBeenViewed: Bool

    // MARK: - Init Method
    init(value: String, hasBeenViewed: Bool){
        self.value = value
        self.hasBeenViewed = hasBeenViewed
    }
}

如有任何帮助,我们将不胜感激。谢谢!

最佳答案

1- 滚动不是断断续续的尝试它工作正常

2- 当您在此处添加此行时

sleep(2)
self.sampleData[indexPath.row].hasBeenViewed = true

虽然它应该在这里

if !self.sampleData[indexPath.row].hasBeenViewed {
   self.sampleData[indexPath.row].hasBeenViewed = true

当你延迟分配 hasBeenViewed = true 当你来回滚动 1 个项目时 if 触发它的调用次数 > 1 所以你看到结果 > 100 不像 when你慢慢滚动

关于ios - 正在更新的单元格多于表中存在的单元格数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59645855/

相关文章:

ios - 如何在 Titanium 和 Pixate 中使用实时 CSS 样式

ios - ios13-unSelectedItem的UITabBar tintColor不起作用

ios - swift/ios 如何检查我的 TableView 是否嵌入在 uitableview Controller 实例中?

ios - 当超出 UITableViewCell 边界时, subview 会被修剪

ios - gestureRecognizer shouldReceiveTouch 坚持在释放 View 导致崩溃

objective-c - 在 UIViewController 中向 NSNotificationCenter 添加和删除观察者

ios - 一个应用程序中的多个 mapView

objective-c - openssl/bn.h : No such file or directory

ios - MKMapView 不呈现(仅当来自背景时)

arrays - 如何从数组中获取随机元素而不多次获取相同元素?