按字典中的日期划分表视图
Posted
技术标签:
【中文标题】按字典中的日期划分表视图【英文标题】:Sectioning a tableview by dates from a dictionary 【发布时间】:2020-06-06 11:59:46 【问题描述】:我有一个字典,其中包含一个 Date 的键/值对,其中包含一组按相同日期分组的自定义对象 Meals。
膳食对象:
class Meal: NSObject, Codable
var id: String?
var foodname: String?
var quantity: Float!
var brandName: String?
var quantityType: String?
var calories: Float!
var date: Date?
在我的 TableView 中:
var grouped = Dictionary<Date, [Meal]>()
var listOfAllMeals = [Meal]() //already populated
self.grouped = Dictionary(grouping: self.listOfAllMeals.sorted(by: ($0.date ?? nilDate) < ($1.date ?? nilDate) ),
by: calendar.startOfDay(for: $0.date ?? nilDate) )
override func numberOfSections(in tableView: UITableView) -> Int
// #warning Incomplete implementation, return the number of sections
return grouped.count
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
return Array(grouped.keys)[section] as! String //this throws a thread error
这允许用户每天多次上传餐点以供将来查看,现在我想在 TableView 中显示餐点,按日期划分并按最新排序。我如何做到这一点?
【问题讨论】:
你在这个问题中使用我的答案很有趣,这是否意味着它对你有用? 【参考方案1】:为这些部分创建一个结构
struct Section
let date : Date
let meals : [Meal]
并将分组字典映射到Section
的数组
var sections = [Section]()
let sortedDates = self.grouped.keys.sorted(>)
sections = sortedDates.mapSection(date: $0, meals: self.grouped[$0]!)
您可以添加日期格式化程序以更有意义地显示 Date
实例。
表格视图数据源方法是
override func numberOfSections(in tableView: UITableView) -> Int
return sections.count
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
return sections[section].date.description
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return sections[section].meals.count
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "foodCell", for: indexPath)
let meal = sections[indexPath.section].meals[indexPath.row]
...
注意:
考虑使用更少的选项和结构而不是NSObject
子类。与NSCoding
不同,Codable
不需要符合NSObjectProtocol
。并且从不将属性声明为隐式展开的可选属性。
【讨论】:
【参考方案2】:在您的数据模型中,您使用每个条目一天的字典,将键作为数组,并对数组进行排序。
您的 tableview 具有与该数组的条目一样多的部分。您从日期开始创建每个部分的标题。对于每个部分,您从字典中获取餐点数组,因此每个部分具有不同的行数,并且每个行中的数据取自数组的一行。
例如,要获取第 3 节第 5 行的数据,请从索引 3 处的日期数组中获取日期,在字典中查找日期并获取膳食数组,以及索引 5 处的膳食提供数据。
【讨论】:
但是如何从标题标题的某个索引中访问键的值(日期)?以上是关于按字典中的日期划分表视图的主要内容,如果未能解决你的问题,请参考以下文章
DATEDIFF 按创建日期划分范围,利用外部日期按月计算年龄历史