我正在创建一个日历应用程序,并且需要管理日期数组以便为UITableView
提供数据。
数据模型的类型为[Date : [CalendarEvent]]
,其中CalendarEvent
是NSManagedObject
的子类,我将其归类为与事件相关的date属性相关的字典。在UITableView
中,该字典的每个键都有一个部分(我不会一次获取所有日历事件)。但是,我想添加更多部分以使用类型[[Date]]
[ [2018-12-01, 2018-12-02, 2018-12-03, 2018-12-04], [2018-12-05], [2018-12-06, 2018-12-07, 2018-12-08], [2018-12-09], [2018-12-10] ]
,其中每个日期当然都是Date
类型的。 (将分四部分产生)[[Date]]
的格式(在上面的“说明”中有解释)?
我已按比例缩小以仅显示必要的部分。
class CalendarViewController: UIViewController {
private let currentCalenar = Calendar.current
var events : [Date: [CalendarEvent]]? // Events is fetched from todays date and 10 days forward.
var sectionDates : [[Date]]?
func getDatesWithEvents() -> [Date]? {
if let keyArray = events?.keys {
var dateArray = Array(keyArray)
dateArray.sort { $0 < $1 }
return dateArray
}
return nil
}
func getSectionDatesArray() -> [[Date]]? {
var sectionDatesArray : [[Date]] = []
var currentDate = currentCalendar.startOfDay(for: Date())
guard let endDate = currentCalendar.date(byAdding: .day, value: 9, to: currentDate), let datesWithEvent = getDatesWithEvents() else { return nil }
while currentDate < endDate {
if datesWithEvent.contains(currentDate) {
sectionDatesArray.append([currentDate])
sectionDatesArray.append([])
} else {
if !sectionDatesArray.isEmpty {
sectionDatesArray[sectionDatesArray.count - 1].append(currentDate)
} else {
sectionDatesArray.append([currentDate])
}
}
currentDate = currentCalendar.date(byAdding: .day, value: 1, to: currentDate)!
}
sectionDatesArray.removeAll { (sequence) -> Bool in
sequence.isEmpty
}
return sectionDatesArray
}
感谢您阅读我的问题。
答案 0 :(得分:0)
通常,在单个 UITableView 上使用多个数据源会带来倒霉的事情。 ..您可能会考虑更改数据模型。
在您的示例中,我将考虑以没有事件的日期值为nil
的方式合并这两个数据源,因此您将其声明为var dates: [Date: [CalendarEvent]?]?
。
另一种方法-您将切断该词典并使用数组存储类型(建议名称)CalendarItem
的对象-在其中可以存储项目的Date
和[CalendarEvent]?
< / p>
尽管如此,有很多方法可以实现,而我将不介绍所有内容...
如果您想坚持自己的模型,这是我做的一个功能。这可能不是最佳解决方案,有一些魔术可以在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
]
]
*/