Как правило, использование нескольких источников данных на одном UITableView приносит неудачи. .. вы можете подумать об изменении своей модели данных.
В вашем примере я рассмотрел бы объединение этих двух источников данных таким образом, чтобы значения дат без событий были nil
, поэтому вы бы объявили его как var dates: [Date: [CalendarEvent]?]?
.
Другой способ - вы бы обрезали этот словарь и использовали массив для хранения объектов типа (рекомендуемое имя) CalendarItem
- там вы можете хранить элементы Date
и [CalendarEvent]?
Тем не менее, есть много способов сделать это, и я не собираюсь охватывать их все ...
Если вы хотите придерживаться своей модели, вот функция, которую я сделал.Это, вероятно, не оптимальное решение, и есть какая-то магия, которая может сделать это в 4 строки :), но здесь вы идете -
var currentDate = Date()
// just made up dates
let datesWithEvents: [Date] = [
Calendar.current.date(byAdding: .day, value: 5, to: currentDate)!,
Calendar.current.date(byAdding: .day, value: 10, to: currentDate)!
]
let endDate = Calendar.current.date(byAdding: .day, value: 15, to: currentDate)!
var dates: [[Date]] = []
while currentDate < endDate{
if datesWithEvents.contains(currentDate){
dates.append([currentDate])
dates.append([])
}else{
if !dates.isEmpty{
dates[dates.count - 1].append(currentDate)
}else{
dates.append([currentDate])
}
}
currentDate = Calendar.current.date(byAdding: .day, value: 1, to: currentDate)!
}
/* prints
[
[
2018-12-04 17:57:44 +0000
2018-12-05 17:57:44 +0000
2018-12-06 17:57:44 +0000
2018-12-07 17:57:44 +0000
2018-12-08 17:57:44 +0000
],
[2018-12-09 17:57:44 +0000],
[
2018-12-10 17:57:44 +0000,
2018-12-11 17:57:44 +0000,
2018-12-12 17:57:44 +0000,
2018-12-13 17:57:44 +0000
],
[2018-12-14 17:57:44 +0000],
[
2018-12-15 17:57:44 +0000,
2018-12-16 17:57:44 +0000,
2018-12-17 17:57:44 +0000,
2018-12-18 17:57:44 +0000
]
]
*/