Вы должны сначала получить идею. Представьте, что у вас просто есть один раздел всех ваших событий. Что бы вы имели в качестве своей модели?
Верно?
ХорошоЕсли вышесказанное имеет смысл, вам понадобится несколько указанных моделей. Верно снова? Теперь разбейте это на более конкретные термины. Как фактический тип модели.
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]
. . .
}
. . .
. . .
}