我的情况是,我试图将JSON
数据加载到Tableview
中。在这里,我正在维护Tableview
自定义cell
。每当尝试将数据上传到tableview
时,我都有机会从server
添加新数据。
在这里,加载时我遇到Index
超出范围错误。每次我从JSON
调用viewWillAppear
函数时。我有足够的data
,在数组内部没有不均匀的数据。在code
以下,我正在使用
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated) // No need for semicolon
self.tableArray.removeAll()
self.cartname.removeAll()
self.parentid.removeAll()
self.name.removeAll()
self.year.removeAll()
parseJSON()
}
这是我的JSON流程
if let content = json["content"] as? [[String:String]] {
print(json)
for category in content {
let cat_id = category["cat_id"]
let cat_name = category["cat_name"]
let cat_parentid = category["cat_parentid"]
let name = category["name"]
let year = category["year"]
self.tableArray.append(cat_id ?? "unknnown")
self.cartname.append(cat_name ?? "unknnown")
self.parentid.append(cat_parentid ?? "unknnown")
self.name.append(name ?? "unknnown")
self.year.append(year ?? "unknnown")
}
Tableview单元格数据加载
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! MyCustomCell
cell.cat_id.text = self.tableArray[indexPath.row]
cell.cat_name.text = self.cartname[indexPath.row]// Some time Here I am getting out of range error
cell.cat_parentid.text = self.parentid[indexPath.row]
cell.name.text = self.name[indexPath.row] // Here I am getting out of range error
cell.year.text = self.year[indexPath.row]
return cell
}
}
答案 0 :(得分:1)
使用tableView时,期望具有多个数组,首先从 OOP 点开始,您需要创建1个模型,例如
struct Root: Codable {
let catID, catName, catParentid, year,name: String?
enum CodingKeys: String, CodingKey {
case catID = "cat_id"
case catName = "cat_name"
case catParentid = "cat_parentid"
case year, name
}
}
并使用Codable
解析json
var arr = [Root]()
do {
let content = json["content"] as! [[String:String]]
let staData = try JSONSerialization.data(withJSONObject:content,options:[])
arr = try JSONDecoder().decode([Root].self, from:staData)
}
catch {
print(error)
}
在numberOfRows
return arr.count
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! MyCustomCell
let item = arr[indexPAth.row]
cell.cat_id.text = item.catID
cell.cat_name.text = item.catName
cell.cat_parentid.text = item.catParentid
cell.name.text = item.name
cell.year.text = item.year
return cell
}