已解决:我刚刚添加了“ 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()
}
答案 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]
}
// ..
}
所有项ItemA
,ItemB
类型都可以符合协议Item
。
protocol Item {
}
class ItemA: Item {}
class ItemB: Item {}