我对我的 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/