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
}
}
我有一个 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
}
}