Swift - отображать два разных массива структур в виде таблицы - PullRequest
0 голосов
/ 04 мая 2019

Допустим, у меня есть массив каждой структуры a & b, и в настоящее время я использую табличное представление для отображения массива a. Обе структуры содержат среди прочего дату.

Мое намерение состоит в том, чтобы дополнительно отобразить массив struct b в том же табличном представлении и упорядочить таблицу по датам обоих массивов - не знаю, возможно ли это.

Более того, я хотел бы, чтобы предстоящие даты были не непосредственно в представлении, а только тогда, когда пользователь прокручивает вверх - так сказать, в верхней части таблицы.

TimelineViewController:

extension TimelineViewController: UITableViewDataSource, UITableViewDelegate {

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let rowData = addDataArray[indexPath.row]

        let cell = tableView.dequeueReusableCell(withIdentifier: "TimelineCell") as! TimelineCell

        cell.setDrivenKm(drivenKm: rowData.driven)
        cell.setDate(date: rowData.date)
        cell.setConsumedL(consumedL: rowData.consumedL)
        cell.setPricePerLiter(pricePerLiter: rowData.pricePerLiter)

        return cell
    }

}


Структура a:

var addDataArray: [addDataStruct] = []

func createStructArray() {
        ...

        let addData: addDataStruct = addDataStruct(date: Date(), ...)
        addDataArray.append(addData)
    }

struct addDataStruct: Codable {
    var ...: Int
    var date: Date
    var ...: Double
    var ...: Double
    var ...: Int
}

Структура b:

var notStructArray: [not] = []

func createStructArray() {
        ...
        let notificationData: not = not(date: datePicker.date, ...)
        notStructArray.append(notificationData)
        notStructArray.sort(by: { $0.date < $1.date })
    }

struct not: Codable {
    var ...: String
    var ...: String
    var date: Date
    var ...: Int
    var ...: Int
}

1 Ответ

0 голосов
/ 04 мая 2019

Создайте protocol с общим свойством с типом Date и добавьте его в обе структуры. В ViewController добавьте массив, который объединяет и массив, и сортировку по дате.

Используйте этот массив в tableView методах источника данных.

protocol CommonData {
    var date: Date { get }
}
struct A: CommonData, Codable {
    var date: Date
    var x: String
}
struct B: CommonData, Codable {
    var date: Date
    var y: String
}
class TimelineViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    var arr1: [A] = []
    var arr2: [B] = []
    var totalArr: [CommonData] {
        return (arr1 as [CommonData]) + (arr2 as [CommonData]).sorted(by: { $0.date < $1.date })
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        arr1.append(A(date: Date(), x: "x"))
        if let yesterDay = Calendar.current.date(byAdding: .day, value: -1, to: noon) {
            arr2.append(B(date: yesterDay, y: "y"))
        }
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return totalArr.count
    }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier")
            ?? UITableViewCell(style: .default, reuseIdentifier: "reuseIdentifier")
        print(totalArr[indexPath.row].date.description)
        if let data = totalArr[indexPath.row] as? A {
            print(data.x)
        } else if let data = totalArr[indexPath.row] as? B {
            print(data.y)
        }
        return cell
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...