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