организация дат в секциях uitableview - PullRequest
0 голосов
/ 05 ноября 2018

Я не знаю с чего начать ... Мне нужно 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 голосов
/ 05 ноября 2018

Исходя из вашего случая, генерация 2d массива будет подходящим выбором.

Как это сделать?

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

таким образом transfomredArray является массивом массивов, каждый массив должен содержать модели с одинаковой датой.

Поэтому вы можете обрабатывать метод источника данных табличного представления на основе этого, например:

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
}
0 голосов
/ 05 ноября 2018

Использование словарной группы по функциональности. Вы можете организовать свой массив по ключам и значениям, ключом будут ваши разделы, а значения будут вашими необработанными.

пример группировки по дням:

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
}

для примера допустим, что днем ​​параметра "start" для model1 является воскресенье и днем ​​параметра "start" для 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
}
0 голосов
/ 05 ноября 2018

Прямо сейчас ваш режим представляет собой простой массив. Поскольку вам нужны группировки, ваша модель должна немного измениться, чтобы она включала разделы / группы. Вы можете начать со словаря массивов, где ключами являются, скажем, месяц или рабочая неделя.

Взгляните на Swift reduce:into:, где вы можете перебрать существующий массив и разбить его на такой словарь.

Затем сортируйте ключи словаря в массив 'section'. Количество это количество разделов вашего табличного представления. Так что теперь ваша модель имеет массив sections и словарь dateInfo.

Когда табличное представление запрашивает строку, найдите ключ в массиве разделов 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...

Надеюсь, этого достаточно, чтобы указатель направил вас в правильном направлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...