gpt4 book ai didi

ios - HeaderCell 仅被添加到 TableView 一次

转载 作者:行者123 更新时间:2023-11-28 05:42:31 25 4
gpt4 key购买 nike

为了显示每个用户输入,我创建了一个显示结构数组的 TableView 。它工作正常,但我目前正在尝试向显示输入日期的每个条目添加一个 headerCell

因此,我创建了另一个名为 DateCell 的单元格来显示日期。此外,我还添加了:func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) 到 TableViewController。

我的方法有效,但只是部分有效 - DateCell 正在显示,但只显示一次,所有 timelineCells 都包含下面的条目。每次添加条目并因此添加 timelineCell 时,DateCell 中的日期只会被更新,但我希望每个 timelineCell有自己的 DateCell 和自己的日期。

表格 View Controller

class TimelineViewController: UIViewController {

@IBOutlet weak var toolbar: UIToolbar!
@IBOutlet weak var timlineView: UITableView!
@IBOutlet weak var buttonBack: UIBarButtonItem!

let defaults = UserDefaults.standard

var isAsc = false

override func viewDidLoad() {
super.viewDidLoad()
sortArray()
self.setToolbarInvisible(toolbar: toolbar)
timlineView.delegate = self
timlineView.dataSource = self
setShadow()
}

...

func sortArray() {
addDataArray.sort(by: { $1.date < $0.date })
}

}

extension TimelineViewController: UITableViewDataSource, UITableViewDelegate {

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let rowData = addDataArray[indexPath.row]

let cell = tableView.dequeueReusableCell(withIdentifier: "TimelineCell") as! TimelineCell

cell.setDrivenKm(drivenKm: rowData.driven)
cell.setConsumedL(consumedL: rowData.consumedL)
cell.setPricePerLiter(pricePerLiter: rowData.pricePerLiter)

return cell
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let rowData = addDataArray[section]
let headerCell = tableView.dequeueReusableCell(withIdentifier: "DateCell") as! DateCell

headerCell.setDate(date: rowData.date)

return headerCell
}

}

标题单元格

class DateCell: UITableViewCell {

@IBOutlet weak var dateLabel: UILabel!

func setDate(date: Date) {
let date = date
let formatter = DateFormatter()
formatter.dateFormat = "dd.MM.yyyy"

let currentDate = formatter.string(from: date)
dateLabel.text = currentDate
}

}

最佳答案

正如 Sean 在他的评论中提到的,您可以为 addDataArray 的每个条目创建一个部分。

您需要返回节数并将每个节中的 numberOfRows 更改为 1。此外,您还需要更改为时间线单元格检索数据的方式,使用部分而不是行。

所以你需要像这样改变你的 UITableViewDelegate 方法:

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

func numberOfSections(in tableView: UITableView) -> Int {
return addDataArray.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let rowData = addDataArray[indexPath.section]

let cell = tableView.dequeueReusableCell(withIdentifier: "TimelineCell") as! TimelineCell

cell.setDrivenKm(drivenKm: rowData.driven)
cell.setConsumedL(consumedL: rowData.consumedL)
cell.setPricePerLiter(pricePerLiter: rowData.pricePerLiter)

return cell
}

或者,您可以将单元格计数加倍,并将标题和项目都作为单元格返回

然后你需要做这些改变:


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return addDataArray.count * 2
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

if indexPath.row % 2 == 0 {
let rowData = addDataArray[indexPath.row / 2 ]

let headerCell = tableView.dequeueReusableCell(withIdentifier: "DateCell") as! DateCell

headerCell.setDate(date: rowData.date)

return headerCell
} else {
let rowData = addDataArray[indexPath.row / 2]

let cell = tableView.dequeueReusableCell(withIdentifier: "TimelineCell") as! TimelineCell

cell.setDrivenKm(drivenKm: rowData.driven)
cell.setConsumedL(consumedL: rowData.consumedL)
cell.setPricePerLiter(pricePerLiter: rowData.pricePerLiter)

return cell
}
}

我创建了一个 playground 来展示示例。看看here .

关于ios - HeaderCell 仅被添加到 TableView 一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56113586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com