按月顺序填充 TableView 部分中的对象
Populate objects in TableView sections by months order
我有一个包含日期 属性 的对象数组。我想根据他们的月度顺序在 UITableView 部分中分发它们。我该怎么做?
我的模特:
class Birthday: Object {
@objc dynamic var name: String = ""
@objc dynamic var date: Date = Date()
@objc dynamic var dayLeft: Int = 0
@objc dynamic var userImageData: Data?
}
首先,我将下一个代码与 DateFormatter 一起使用:
var grouped: [String: [Birthday]] = [:]
grouped = Dictionary(grouping: birthdaysList) { item -> String in
let calendar = Calendar.current
let components = calendar.dateComponents([.year, .month], from: item.date)
let date = calendar.date(from: components) ?? Date(timeIntervalSince1970: 0)
return date.monthAsString()
}
extension Date {
func monthAsString() -> String {
let df = DateFormatter()
df.setLocalizedDateFormatFromTemplate("MMM")
return df.string(from: self)
}
}
然后我使用:
struct Section {
let month: String
let birthdays: [Birthday]
}
var sections: [Section] = []
let keys = Array(grouped.keys)
sections = keys.map({Section(month: [=12=], birthdays: grouped[[=12=]]!)})
但我需要按顺序对月份名称进行排序。一月、二月等。如何做到这一点?
我尝试从我的代码中 return 元组,但出现错误
声明的闭包结果“(String, Int)”与上下文类型不兼容'String'
grouped = Dictionary(grouping: birthdaysList) { item -> (String, Int) in
let calendar = Calendar.current
let components = calendar.dateComponents([.year, .month], from: item.date)
let date = calendar.date(from: components) ?? Date(timeIntervalSince1970: 0)
return (date.monthAsString(), components.month!)
}
创建包装器结构
struct Section {
let month : String
let birthdays : [Birthday]
}
然后将分组字典映射到Section
的数组
let keys = Array(grouped.keys)
let sections = keys.map({Section(month: [=11=], birthdays: grouped[[=11=]]!)})
sections
代表章节,birthdays
行,month
章节 header 标题。
编辑:
为了能够按序号对月份进行排序return月份名称前面的数字
grouped = Dictionary(grouping: birthdaysList) { item -> String in
let calendar = Calendar.current
let components = calendar.dateComponents([.year, .month], from: item.date)
let date = calendar.date(from: components) ?? Date(timeIntervalSince1970: 0)
return "\(components.month!)_" + date.monthAsString()
}
并修改映射代码
let keys = grouped.keys.sorted{[=13=].localizedStandardCompare() == .orderedAscending}
let sections = keys.map({Section(month: [=13=].components(separatedBy:"_").last!, birthdays: grouped[[=13=]]!)})
我有一个包含日期 属性 的对象数组。我想根据他们的月度顺序在 UITableView 部分中分发它们。我该怎么做?
我的模特:
class Birthday: Object {
@objc dynamic var name: String = ""
@objc dynamic var date: Date = Date()
@objc dynamic var dayLeft: Int = 0
@objc dynamic var userImageData: Data?
}
首先,我将下一个代码与 DateFormatter 一起使用:
var grouped: [String: [Birthday]] = [:]
grouped = Dictionary(grouping: birthdaysList) { item -> String in
let calendar = Calendar.current
let components = calendar.dateComponents([.year, .month], from: item.date)
let date = calendar.date(from: components) ?? Date(timeIntervalSince1970: 0)
return date.monthAsString()
}
extension Date {
func monthAsString() -> String {
let df = DateFormatter()
df.setLocalizedDateFormatFromTemplate("MMM")
return df.string(from: self)
}
}
然后我使用:
struct Section {
let month: String
let birthdays: [Birthday]
}
var sections: [Section] = []
let keys = Array(grouped.keys)
sections = keys.map({Section(month: [=12=], birthdays: grouped[[=12=]]!)})
但我需要按顺序对月份名称进行排序。一月、二月等。如何做到这一点?
我尝试从我的代码中 return 元组,但出现错误
声明的闭包结果“(String, Int)”与上下文类型不兼容'String'
grouped = Dictionary(grouping: birthdaysList) { item -> (String, Int) in
let calendar = Calendar.current
let components = calendar.dateComponents([.year, .month], from: item.date)
let date = calendar.date(from: components) ?? Date(timeIntervalSince1970: 0)
return (date.monthAsString(), components.month!)
}
创建包装器结构
struct Section {
let month : String
let birthdays : [Birthday]
}
然后将分组字典映射到Section
let keys = Array(grouped.keys)
let sections = keys.map({Section(month: [=11=], birthdays: grouped[[=11=]]!)})
sections
代表章节,birthdays
行,month
章节 header 标题。
编辑:
为了能够按序号对月份进行排序return月份名称前面的数字
grouped = Dictionary(grouping: birthdaysList) { item -> String in
let calendar = Calendar.current
let components = calendar.dateComponents([.year, .month], from: item.date)
let date = calendar.date(from: components) ?? Date(timeIntervalSince1970: 0)
return "\(components.month!)_" + date.monthAsString()
}
并修改映射代码
let keys = grouped.keys.sorted{[=13=].localizedStandardCompare() == .orderedAscending}
let sections = keys.map({Section(month: [=13=].components(separatedBy:"_").last!, birthdays: grouped[[=13=]]!)})