我不知道从哪里开始...
我需要一个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
}
非常感谢您的帮助!
答案 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
}