在uitableview部分中组织日期

时间:2018-11-05 12:09:01

标签: ios swift tableview

我不知道从哪里开始... 我需要一个TableView才能显示按日期组织的信息。 我创建了一个“模型”类来保存数据...

class Model: NSObject {

var start: Date?
var str: String?

override init()
{

}

init(start: Date, str: String) {

    self.start = start
    self.str = str

}

创建该类的元素

let value1 = Model(start: Date1(), str: string1)
let value2 = Model(start: Date2(), str: string2)

填充该元素的数组:

var array = [Model]()
array.append(value1, value2)

填充TableView 我如何将array划分为几个月或每周工作等,等等。 我希望tableView组织sections中的数据!?

func numberOfSections(in tableView: UITableView) -> Int {
    return array.count
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let label = UILabel()
    label.text = "January", Febuary, e.g.
    return label
}


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return ?
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! TC_Arbeitszeit
cell.label.text = ?

    return cell
}

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

按功能使用字典组。您可以将数组组织成键和值,键将是您的部分,值将是您的原始值。

按天分组的示例:

extension Date {
    var day: Int? {
        let components = Calendar.current.dateComponents([.day], from: self)
        return components.day
    }
}

let array = [model1, model2]

let dict = Dictionary(grouping: array) { (model) -> Int in
    return model.start?.day ?? 0
}

在示例中,假设model1的“开始”参数的日期为星期日 并且model2上“开始”参数的日期为星期一

所以字典将像这样将其分组:

[1: [model1], 2: [model2]]

现在您可以将键用作部分,将值用作行

func numberOfSections(in tableView: UITableView) -> Int {
    return dict.keys ?? 0
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let day = dic.keys[section]
    let label = UILabel()
    label.text = String(day)
    return label
}


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let key = dict[section]
    return dict[key].count ?? 0
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! TC_Arbeitszeit
    let data = dict[indexPath.section]
    cell.label.text = String(data[indexPath.row].start.day)

    return cell
}

答案 1 :(得分:1)

现在,您的模式是一个简单的数组。由于您要分组,因此您的模型需要稍作更改,以使其包括节/组。您可能从数组字典开始,其中的键是月或工作日。

看看Swift's reduce:into:,您可以在其中遍历现有数组并将其分解成这样的字典。

然后将字典的键分类为“ sections”数组。此计数是您的表视图的部分计数。因此,现在您的模型有了一个sections数组和一个字典dateInfo

当表格视图要求一行时,请在sections数组let key = sections[indexPath.section]中查找键,然后找到模型项本身:

var dateInfo: [Date: [Model]]
var sections: [Date] // sorted
...
let sectionContent = dateInfo[key] as! [Model]
// rowCount is just sectionContent.count
let rowInfo = sectionContent[indexPath.row]
// populate cell...

希望这足以使您朝正确的方向前进。

答案 2 :(得分:0)

根据您的情况,生成一个 2d数组是合适的选择。

如何做到?

let transfomredArray = Array(Dictionary(grouping: array, by: { $0. start! }).values)

因此transfomredArray是一个数组数组,其中的每个数组都应包含具有相同日期的模型。

因此,您可以基于此来处理tableview数据源方法,例如:

func numberOfSections(in tableView: UITableView) -> Int {
    return transfomredArray.count
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let label = UILabel()
    let date = transfomredArray[section][0].start!
    label.text = "\(date)"
    return label
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return transfomredArray[section].count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! TC_Arbeitszeit
    cell.label.text = transfomredArray[indexPath.section][indexPath.row]

    return cell
}