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