如何在tableview Swift 3中按日期对项目进行排序

时间:2017-12-19 04:26:17

标签: ios uitableview sorting swift3

因此,在我的应用中,用户可以创建费用并按月存储和查看。目前,我的所有费用都按照我添加的顺序显示,但我希望它们按日期顺序显示,我还希望有一个带有日期的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)

}

每个费用都是一个单独的对象,存储在核心数据中,并具有名称,数量,修改日期等属性。我希望它们按修改日期排序。我该怎么做呢?

2 个答案:

答案 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]