按日期分组和排序TableView

时间:2015-07-10 07:30:04

标签: ios swift core-data tableview grouping

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

有我的代码:

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)

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

谁有解决方案?先于

1 个答案:

答案 0 :(得分:0)

你的列表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
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]

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