【问题标题】:Group and Sort TableView by Date按日期对 TableView 进行分组和排序
【发布时间】:2015-09-28 20:39:40
【问题描述】:

我想问如何按日期对数据(部分)进行分组?

这是我的代码:

import UIKit
import CoreData

class TableViewController: UITableViewController {

var myList = []

override func viewDidLoad() {
    super.viewDidLoad()


}

override func viewDidAppear(animated: Bool) {
    let appDel : AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let context : NSManagedObjectContext = appDel.managedObjectContext!

    let freq = NSFetchRequest(entityName: "Item")

    myList = context.executeFetchRequest(freq, error: nil)!

    tableView.reloadData()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {

    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return myList.count
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell

    var object : NSManagedObject = myList[indexPath.row] as! NSManagedObject

    let name = object.valueForKeyPath("name") as! String
    let qty = object.valueForKeyPath("qty") as! Int
    let date = object.valueForKeyPath("date") as! String

    cell.nameLabel.text = name
    cell.qtyLabel.text = toString(qty)
    cell.dateLabel.text = date

    return cell
}

}

详细: 现在我的日期样本只是行(默认只有 1 节) 示例:

apple  1  Jul 10, 2015 (row 1)
orange 7  Jul 10, 2015 (row 2)
grape  5  Jul 11, 2015 (row 3)

我想按日期分组,所以结果如下:

Jul 11, 2015 (section 1)
    grape 5 (row 1)
Jul 10, 2015 (section 2)
    apple 1 (row 2)
    orange 7 (row 3)

注意:部分是动态的,取决于数据,并且排序日期降序

有人有解决办法吗?谢谢之前

【问题讨论】:

  • 我推荐使用NSFetchedResultsController。 Apple docs 描述得很好并且有样板代码。
  • 你有在 Swift 代码中使用 NSFetchedResultsController 的示例吗?
  • 我现在不在我的 MacBook 上,我可以稍后发布。或者,我很确定如果您使用 Apple 的 Master-Detail 模板创建一个新项目,并选择“使用 CoreData”,那么样板将被复制到主视图控制器 swift 文件中。
  • 同时,您还有一个额外的困难 - 您的date 的排序顺序将不合逻辑,因为它将被排序为字符串而不是日期。我建议将该字符串重新排列为 yyyy-mm-dd 格式,这样可以很好地排序,然后将其操作为您喜欢的格式以进行显示。
  • 也许这有点帮助:stackoverflow.com/a/30544650/1187415.

标签: ios swift core-data tableview grouping


【解决方案1】:

您的列表 myList 应该是字典形式或数组数组。

例如,如果是字典,它应该是这样的

var myList: [String: [NSManagedObject]] = [:]

以日期为键

这一切都是为了将​​您的数据整理成正确的格式。在 viewDidAppear 你可以做类似的事情

for object in freq {
        if let array = myList[object.valueForKeyPath("date")!] {
            var a = array
            a.append(object)
            myList[object.date!] = a
        } else {
            myList[object.date!] = [object]
        }
    }

那么 在 numberOfSectionsInTableView 中,

return myList.count

in numberOfRowsInSection

if let a = myList[sections[section]] {
        return a.count
    }
    return 0
}

部分已排序

var sections: [String] {
    return Array(myList.keys).sorted(<)
}

在cellForRowAtIndexPath中,可以得到对应的对象。

let array = myList[sections[indexPath.section]]!
let object = array[indexPath.row]

你还需要用

实现viewForHeaderInSection
let date = sections[section]

我确信有更好的方法可以做到这一点,但这足以动态填充表格视图。我只是想让你看到一个想法。希望对你有帮助。

【讨论】:

  • tq 建议,使用 NSFetchedResultsController 更好:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 2021-02-23
  • 2016-09-30
相关资源
最近更新 更多