ios - 正在更新的单元格比表中存在的单元格数量多?
问题描述
我被我的Swift
iOS 应用程序中的一个简单问题难住了。我正在尝试做的是在每个显示“Hello World”cells
的地方显示 100 个列表。tableview
cell
在内部cellForRowAt:
,我通过在background thread
. 模拟网络调用完成后,我更新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,这与缓慢滚动时不同
推荐阅读
- docker - 在运行 .net Core IBM MQ 的 Linux Docker 容器中出现 MQRC_HOST_NOT_AVAILABLE 错误。任何解决方案
- java - 如何在 Selenium 中打开不同的 URL(使用不同的用户名和密码)
- c++ - cmake链接irrklang库
- mysql - Nodejs mysql服务器关闭连接
- php - 用一系列序列号替换短代码中的内容
- css - 如何在 CSS 中为 img 的 alt 文本赋予 line-height
- java - 从 Docker 容器中的 Java 应用程序访问 Windows 10 中的文件夹
- image-processing - 如何在每个单元格中使用随机图像制作网格 - 处理
- javascript - [nextjs]:getStaticProps 在开发过程中缺少参数键
- scapy - 使用 scapy 嗅探上游 HTTP 请求