使用日期的UITableViewCell分隔符

时间:2017-01-27 14:17:12

标签: swift uitableview date separator

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

1 个答案:

答案 0 :(得分:0)

这是一个简单的实现,它接受tableData,并维护一个唯一的日期列表,用作节头。在此示例中,我从头开始重新创建标头,但在实际实现中,您可能希望更新。

我为我的样本数据定义了一个结构

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)
        }
    }
}

我定义了几个函数来在Date和String之间切换。

这里是如何实现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{$0.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{$0.date == tableDataSectionHeaderData[indexPath.section]}

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

        return cell
    }
}