我有一个带有Title,startDate和endDate的JSON文件。我想按日期对我的UITableView中的部分进行分组,并将每个组的日期添加为标题。我不确定如何从groupByDate函数检索数据以填充特定部分。我必须从groupByDate函数创建一个新数组。
var eventList: [Event] = []
var eventGroup: [[Event]] = []
func numberOfSections(in tableView: UITableView) -> Int {
return eventGroup.count
}
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
v.backgroundColor = .darkGray
return v
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return 3.0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) as! MyTableCell
cell.titleLabel.textColor = .red
}else{
cell.titleLabel.textColor = .black
}
return cell
}
答案 0 :(得分:0)
假设的初始数据是这样的
[
{
"title": "Bicycling with Friends",
"start": "11-01-2018"
},
{
"title": "Yoga",
"start": "11-01-2018"
},
{
"title": "Yoga",
"start": "11-02-2018"
}
]
如果要对显示进行分组,则需要将数组组装成这样的日期,每组标题可以使用start
[
[
{
"title": "Bicycling with Friends",
"start": "11-01-2018"
},
{
"title": "Yoga",
"start": "11-01-2018"
}
],
[
{
"title": "Yoga",
"start": "11-02-2018"
}
]
]
我认为您的数据源可以包含二维数组eventGroup
或带日期的字典[dateString : [event]]
。只能将eventGroup
修改为这样
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return eventGroup[section].count
}
func numberOfSections(in tableView: UITableView) -> Int {
return eventGroup.count
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
let events = eventGroup[section]
let event = events.first
return event?.title //Replace with the header title you want
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) as! MyTableCell
let events = eventGroup[indexPath.section]
let dateRow = events[indexPath.row].start
let dateRowEnd = events[indexPath.row].end
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let myString = formatter.string(from: dateRow)
let yourDate = formatter.date(from: myString)
formatter.dateFormat = "MM-dd-yyyy h:mm a"
let myStringafd = formatter.string(from: yourDate!)
cell.titleLabel.text = eventList[indexPath.row].title
cell.dateStartLabel.text = "Start date: \(myStringafd)"
if events[indexPath.row].conflict == true {
cell.titleLabel.textColor = .red
}else{
cell.titleLabel.textColor = .black
}
return cell
}
答案 1 :(得分:0)
您需要先了解一下主意。假设您只是所有活动的一个部分。您的模型会有什么?
对吗?
好的,如果以上所述有意义,那么您将需要多个所述模型。再说一次现在将其分解为更具体的术语。就像实际的模型类型一样。
struct Event {
let title: String
let startDate: Date
// maybe an endDate object too
}
struct Section {
let title: String
let events: [Event]
}
因此,现在您需要向表视图提供Section
对象的数组。
但是在此之前,您将需要通过group
对象startDate
对自己的部分进行操作。 Swift 具有Dictionary
类型的非常方便的初始值设定项,它允许我们通过从数组中的对象中选择特定属性的值来对数组进行分组。请注意以下功能:
func groupedSectionsByDate(from events: [Event]) -> [Section] {
let grouped = Dictionary(grouping: events) { $0.startDate }
// here you will need a date formatter object that will be used to convert
// the Date type to String type. It's left as an assignment for the reader
let dateFormatter: DateFormatter // init and configure it yourself
let sections = grouped.map { Section(title: dateFormatter.string(from: $0.key), events: $0.value) }
return sections
}
上面的功能应该为您提供标题按日期分组的部分。
现在您将如何在表格视图中使用它?
class TableViewController: UITableViewController {
. . .
let sections = [Section]()
. . .
. . .
func numberOfSections(in tableView: UITableView) -> Int {
return sections.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return sections[section].count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
. . .
let event = sections[indexPath.section].events[indexPath.row]
. . .
}
. . .
. . .
}