如何在Swift中重新初始化UITableViewCell



我正在使用UITableViewCell来显示数据。当视图加载时,数据是空的,但是一旦api调用完成,我想重新初始化UITableViewCell,以便数据可以显示。我使用以下代码,但TableView.reloadData()不会重新初始化UITableViewCell,因此数据不会重新加载。

TableViewCell

class TableViewCell: UITableViewCell {

var Info: Information?
let Chart = LineChartView(frame: .zero)

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
print("initialized")
self.contentView.addSubview(Chart)
Chart.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
Chart.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant: 10),
Chart.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor, constant: -10),
Chart.rightAnchor.constraint(equalTo: self.contentView.rightAnchor, constant: -10),
Chart.leftAnchor.constraint(equalTo: self.contentView.leftAnchor, constant: 10),
])
let data = ChartHelpers().makeLineChart(data: Info?.Values ?? [Double]())
Chart.data = data
self.contentView.layoutIfNeeded()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}

ViewController


class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var Info: Information?
let TableView = UITableView(frame: .zero)

override func viewDidLoad() {
super.viewDidLoad()
APICall()
setUpUI()
}
func setUpUI() {
view.addSubview(TableView)
TableView.translatesAutoresizingMaskIntoConstraints = false

NSLayoutConstraint.activate([
TableView.topAnchor.constraint(equalTo: view.topAnchor),
TableView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
TableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
TableView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
])
self.TableView.register(TableViewCell.self, forCellReuseIdentifier: "Chart")
TableView.delegate = self
TableView.dataSource = self
TableView.reloadData()
view.layoutIfNeeded()
}
func APICall() {
API().fetchInformation(Name: "John Doe") { (Info) in
//success connecting to api
DispatchQueue.main.async {
self.Info = Info
self.TableView.reloadData()
}
} failure: { (error) in
//failure connecting to api
}
}
}

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = TableView.dequeueReusableCell(withIdentifier: "Chart", for: indexPath) as! TableViewCell
tableView.rowHeight = 300
cell.Info = self.Info
return cell
}
}

最好不要在init中进行配置,因为单元实例可能会被重用。应在对单元格进行排队时进行安装。这可以通过设置方法来完成,也可以通过设置属性来完成,就像您在这里对Info所做的那样(顺便说一句,将其命名为info会更快捷(。

在这里获得所需内容的最简单方法是将didSet添加到Info属性中,并调用那里的设置方法:

var info: Information? {
didSet {
let data = ChartHelpers().makeLineChart(data: Info?.Values ?? [Double]())
Chart.data = data
self.contentView.layoutIfNeeded()
}
}

尽管从长远来看,其他重构可能会更好。

didSet添加到Info变量中,以触发构建图表。

var Info: Information? {
didSet {
let data = ChartHelpers().makeLineChart(data: Info?.Values ?? [Double]())
Chart.data = data
self.contentView.layoutIfNeeded()
}
}

didSet观察器在init期间不会激发,因此当API调用后有有效数据时,当单元重新加载时,您需要再次调用序列。

最新更新