按日期对UITableView部分进行分组

时间:2019-10-14 02:10:36

标签: ios swift uitableview

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

2 个答案:

答案 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]
        . . .
    }
    . . .
    . . .
}