Swift Tableview数据加载使索引超出范围

时间:2019-02-15 20:51:00

标签: json swift tableview

我的情况是,我试图将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
    }
}

1 个答案:

答案 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 
}