UITableViewCell 分隔符使用日期

UITableViewCell Separator using a date

我有一个 ViewController,其中有 2 个 TextField 和一个 DatePicker 视图,当我单击“保存”按钮时我想使用我选择的日期作为 TableviewController 的 Header 部分。如果其他 Objects 跟随并且他们有相同的日期,他们应该在同一日期部分一起分组。我在这个项目中没有使用 CoreData,所以请不要建议使用 CoreData 为这个任务提供的方法。enter image description here

这是一个简单的实现,它获取您的 tableData,并维护一个唯一日期列表以用作部分 headers。在此示例中,我从头开始重新创建 headers,但在实际实施中,您可能需要更新。

我为示例数据定义了一个结构

struct SampleData
{
    var date        = Date()
    var textField1  = ""
    var textField2  = ""
}

并创建了一些数据

var tableData : [SampleData] = []
var tableDataSectionHeaderData : [Date] = []

override func viewDidLoad()
{
    super.viewDidLoad()

    tableData.append(SampleData(date: stringAsDate("Feb 13, 2017")!, textField1: "Title 1", textField2: "text2"))
    tableData.append(SampleData(date: stringAsDate("Feb 13, 2017")!, textField1: "Title 2", textField2: "text2"))
    tableData.append(SampleData(date: stringAsDate("Feb 14, 2017")!, textField1: "Title 3", textField2: "text2"))
    // and so on...

    createSectionHeaders()
}

func createSectionHeaders()
{
    tableDataSectionHeaderData.removeAll() // in a realistic scenario, you would probably update this rather than recreating from scratch
    for entry in tableData
    {
        if !tableDataSectionHeaderData.contains(entry.date)
        {
            tableDataSectionHeaderData.append(entry.date)
        }
    }
}

我定义了几个函数来在日期和字符串之间切换。

下面是实现 tableView 方法的方法

extension ViewController : UITableViewDelegate, UITableViewDataSource
{
    func numberOfSections(in tableView: UITableView) -> Int
    {
        return tableDataSectionHeaderData.count
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        let filteredData = tableData.filter{[=12=].date == tableDataSectionHeaderData[section]}
        return filteredData.count
    }

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
    {
        return dateAsString(tableDataSectionHeaderData[section])
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 

        let filteredData = tableData.filter{[=12=].date == tableDataSectionHeaderData[indexPath.section]}

        cell.textLabel?.text = "\(dateAsString(filteredData[indexPath.row].date))  \(filteredData[indexPath.row].textField1)"

        return cell
    }
}