【问题标题】:Swift - display two different arrays of structs in a table viewSwift - 在表格视图中显示两个不同的结构数组
【发布时间】:2019-05-05 01:55:01
【问题描述】:

假设我有一个包含每个结构 ab 的数组,我目前正在使用表格视图来显示数组 a。这两个结构都包含日期。

我的意图是在同一个表视图中另外显示 struct b 的数组,并按两个数组的日期对表进行排序 - 不知道这是否可能。

此外,我希望即将到来的日期不直接显示在视图中,而仅在用户向上滚动时 - 可以说是在表格顶部。

时间线视图控制器:

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
}

【问题讨论】:

  • 不清楚你的目标是什么。您想显示结构 A 中的所有行,然后显示结构 B 中的所有行,还是要将两个数组混合在一起,全部按日期排序,然后按顺序显示所有行,而不管是哪个结构从?换句话说,例如,您想要“A A A A B B B”还是想要“A B B A B A A”?
  • @rmaddy 我希望将它们混合在一起,然后按日期排序。

标签: ios swift uitableview


【解决方案1】:

创建一个具有Date 类型的公共属性的protocol 并将其添加到两个结构中。在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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 2019-02-15
    • 2016-06-06
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多