Множество типов клеток Swift 4.2 - PullRequest
0 голосов
/ 17 марта 2019

РЕШЕНО: Я только что добавил «в-в»

Я надеюсь, что кто-нибудь мне поможет.Как я могу отображать ячейки с различными элементами внутри, удовлетворяющими «последовательности» порядка.Ячейки должны быть расположены в любом порядке и любое количество каждой пользовательской ячейки.Я имею в виду, что первая ячейка должна отображать первый тип элемента, вторая ячейка - второй тип элемента, третья ячейка - первый тип элемента, четвертая ячейка - первый элемент.Это зависит от последовательности из данных 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()
        }
    }

Structдля 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 голосов
/ 17 марта 2019

Было бы лучше сохранить отдельные переменные, содержащие элементы каждого типа.

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]
    }
    // ..
}

Все элементы ItemA, ItemB типы могут соответствовать протоколу, скажем Item.

protocol Item {
}

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