我对我的Swift iOS应用程序中似乎很简单的问题感到困惑。我想做的是在表格中显示100个单元格的列表,每个单元格显示“ Hello World”。在cellForRowAt中:我正在通过在后台线程上执行2秒钟的睡眠调用来模拟网络调用。该模拟网络调用完成后,我将更新表格视图单元格,以使文本以粗体显示。
我在这里有2个问题:1)滚动似乎有些断断续续。您如何解决这个问题?2)当我启动该应用程序时,如果我真的快速向下滚动到列表的末尾,我会看到有100多个单元格被更新(即查看cellForRowAt中的print语句)。但是,如果我从上到下缓慢滚动,则会看到100个单元格已更新。为什么会这样?
这是主要的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
}
}
任何帮助将不胜感激。谢谢!