因此,在我的应用中,用户可以创建费用并按月存储和查看。目前,我的所有费用都按照我添加的顺序显示,但我希望它们按日期顺序显示,我还希望有一个带有日期的tableviewheader,以便将费用分组在一起。我在viewdidLoad中尝试了这段代码。
for expense in monthlyExpenses{
if let dateString = expense.modificationDate?.convertToString(){
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = DateFormatter.Style.medium
dateFormatter.timeStyle = DateFormatter.Style.none
let finalDate = dateFormatter.date(from: dateString)
if let finalDate = finalDate{
let dateString2 = finalDate.timeIntervalSinceReferenceDate
if self.toDoList[dateString2] == nil {
self.toDoList[dateString2] = [expense.name!]
}
else {
self.toDoList[dateString2]?.append(expense.name!)
}
}
}
}
然后在我的tableviewheader部分尝试了此代码,但是出现了EXC_BAD_INSTRUCTION错误。
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
let dateDouble = self.sortedSections[section]
let date = Date(timeIntervalSinceReferenceDate: dateDouble)
let dateformatter = DateFormatter()
dateformatter.dateStyle = DateFormatter.Style.medium
dateformatter.timeStyle = DateFormatter.Style.none
return dateformatter.string(from: date)
}
每个费用都是一个单独的对象,存储在核心数据中,并具有名称,数量,修改日期等属性。我希望它们按修改日期排序。我该怎么做呢?
答案 0 :(得分:0)
我做了类似的事情,但我正在使用已经有xib和方法来调整所有内容的库。这只是我身边的一个小帮助。
您可以准备一个xib来在tableView中显示日期和数据。在这里,如果下一个日期与上一个日期相同,您可以隐藏该行,并在日期更改时显示。 要根据日期显示数据,您可以执行以下操作( 如果根据日期添加数据 )
let expenses = [ExpensesClass]()
// in `cellForItemAt indexPath`
let expense = expenses[indexPath.row]
let date = expense.date
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMMM d, yyyy"
let dateString = dateFormatter.string(from: date! as Date)
. . . . . .
if indexPath.row > 0 {
let previousExpensesData = expenses[indexPath.row - 1].date
let day = Calendar.current.component(.day, from: expense.date) // Do not add above 'date' value here, you might get some garbage value. I know the code is redundant. You can adjust that.
let previousDay = Calendar.current.component(.day, from: expenses[indexPath.row - 1].date)
if day == previousDay {
cell.dateTitle.text = ""
} else {
cell.dateTitle.text = dateString
}
}else{
cell.dateTitle.text = dateString
print("Cannot return previous Message Index...\n\n")
}
您可以使用此方法调整身高 - > func tableView(UITableView, heightForRowAt: IndexPath).
我不确定这种方法 - > func tableView(UITableView, titleForHeaderInSection: Int)
。你也可以尝试这种方法,如果上面的方法不适合你,并相应调整高度 - > func tableView(UITableView, titleForHeaderInSection: Int)
func tableView(_ tableView: UITableView,
heightForRowAt indexPath: IndexPath) -> CGFloat
{
let expense = expenses[indexPath.row]
if indexPath.row > 0{
let day = Calendar.current.component(.day, from: expense.date)
let previousDay = Calendar.current.component(.day, from: expense[indexPath.row - 1].date)
if day == previousDay {
return 0.0
}else{
return 20.0
}
}
return 20.0
}
答案 1 :(得分:0)
<强> 1。创建一个字典,其中包含日期作为键和修改或作为值放置的订单数组。
var orderDictionary [Date:[Order]?] = [:]
for order in yourOrders {
var orders = orderDictionary[order.modificationDate] ?? []
if orders.count == 0 {
orderDictionary[order.modificationDate] = [order]
} else {
orders.append(order)
orderDictionary[order.modificationDate] = orders
}
}
<强> 2。从字典中排序键数组。
let dateArray = orderDictionary.keys
dateArray.sort { $0 < $1 }
根据您的要求更改比较条件,例如您是希望以升序还是降序排列。
第3。在func tableView(UITableView, titleForHeaderInSection: Int)
写
return dateArray[section]
或格式化日期。
<强> 4。在numberOfRowsForSection
写
return orderDictionary[dateArray[section]].count
<强> 5。在cellForRowAtIndexPath
写
let order = orderDictionary[dateArray[indexPath.section]][indexPath.row]