Группировать разделы UITableView по дате - PullRequest
0 голосов
/ 14 октября 2019

У меня есть JSON-файл с заголовком, startDate и endDate. Я хотел бы сгруппировать свои разделы в моем 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 голосов
/ 14 октября 2019

Вы должны сначала получить идею. Представьте, что у вас просто есть один раздел всех ваших событий. Что бы вы имели в качестве своей модели?

  • Название
  • Массив событий

Верно?


ХорошоЕсли вышесказанное имеет смысл, вам понадобится несколько указанных моделей. Верно снова? Теперь разбейте это на более конкретные термины. Как фактический тип модели.


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]
        . . .
    }
    . . .
    . . .
}
0 голосов
/ 14 октября 2019

update

Исходные данные гипотезы выглядят так:

[
    {
        "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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...