【问题标题】:Multiple cell type swift 4.2多细胞类型swift 4.2
【发布时间】:2019-03-17 12:12:11
【问题描述】:

已解决:我刚刚添加了“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()
}

【问题讨论】:

  • 我不明白你的问题。在func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) 中配置单元格,因此您可以在那里决定要显示哪个单元格并控制顺序。
  • 我的意思是我从 json 文件(第二个数组)中获取订单。而且我希望能够在同一个表格视图中使用 2 种不同的单元格类型,但是以随机(或不随机)的顺序。因此,单元格应按任意顺序排列,每个自定义单元格的数量不限。

标签: ios arrays json swift uitableview


【解决方案1】:

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

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 {}

【讨论】:

    猜你喜欢
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多