多单元类型Swift 4.2

时间:2019-03-17 12:12:11

标签: ios arrays json swift uitableview

已解决:我刚刚添加了“ for-in”

我希望有人能帮助我。 如何显示内部具有满足“序列”顺序的不同元素的单元格。单元格应该以任何顺序和任意数量的每个自定义单元格排列。我的意思是第一个单元格应显示第一项类型,第二个单元格应显示第二项类型,第三个单元格应显示第一项类型,第四个单元格应显示第一项。 它取决于json数据的顺序。 我有一个具有下一个结构的json文件(检查序列数组,这是我需要的):

{
    "data": [{
            "name": "first item",
            "data": {
                "text": "first item"
            }
        }, {
            "name": "second item",
            "data": {
                "url": "picture.png"
            }
        }
    ],
    "sequence": ["first item", "second item", "first item", "first item"]
} 

我创建了用于json解析和其他方法的类:

class MyClass {
        private let jsonStr = "url adress"
        var items = [ModelItem]()
        var jsonData: Object!

        func jsonParsing(completionHandler: @escaping (([ModelItem], Error?) -> Void)) {

            guard let url = URL(string: jsonStr) else { return }
            URLSession.shared.dataTask(with: url) { (data, response, error) in

                guard let data = data else { DispatchQueue.main.async {completionHandler([], error)}
                    return
                }
                do {
                    self.jsonData = try JSONDecoder().decode(Object.self, from: data)
                    DispatchQueue.main.async {

                        if let name = self.jsonData?.data[0].data.text {
                            let firstItem = FirstItemModel(text: name)
                            self.items.append(firstItem)
                        }

                        if let pictureUrl = self.jsonData?.data[1].data.url {
                            let secondItem = SecondItemModel(pictureUrl: pictureUrl)
                            self.items.append(secondItem)
                        }
                    }
                    DispatchQueue.main.async {completionHandler(self.items, nil)}
                } catch {
                    print("Error serializing json:", error)
                }
                } .resume()
        }
    }

JSON结构:

struct Object: Decodable {

    let data: [ArrayModelData]
    let sequence: [String]
}

枚举多个单元格类型:

enum ModelItemType: String {
    case firstItem
    case secondItem
}

protocol ModelItem {
    var type: ModelItemType { get }
    var rowCount: Int { get }
    var sectionTitle: String  { get }
}

extension ModelItem {
    var rowCount: Int {
        return 1
    }
}

UITableView方法:

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let item = items[indexPath.section]
    switch item.type {
    case .firstItem:
        ...
    case .secondItem:
        ...       
    return UITableViewCell()
}

1 个答案:

答案 0 :(得分:0)

最好保留一个单独的变量来保存每种类型的项目。

var one: [ItemA]?
var two: [ItemB]?
var seq: [Int] = [1,2,1,1]

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let row = indexPath.row
    var data: [Item]
    if seq[row] == 1 {
        data = one[row]
    } else {
        data = two[row]
    }
    // ..
}

所有项ItemAItemB类型都可以符合协议Item

protocol Item {
}

class ItemA: Item {}
class ItemB: Item {}