HeaderCell仅添加一次到表视图

时间:2019-05-13 13:38:45

标签: ios swift

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

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

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

TableViewController

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
    }

}

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
    }

}

1 个答案:

答案 0 :(得分:1)

如Sean在其评论中所述,您可以为addDataArray的每个条目创建一个部分。

您需要返回节计数并将每个节中的numberOfRows更改为1。另外,您还需要使用section而不是row来更改为时间轴单元格检索数据的方式。

因此,您需要像这样更改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
    }
}

我创建了一个游乐场来展示一个例子。检出here