使用json数据快速填充表格视图4

时间:2018-11-18 01:39:19

标签: json swift uitableview

我有json数据,可以解析导航和名称的第一部分,但是我需要将数组children解析为表视图。

{
"nav": [
    {
        "name": "Home",
        "navigationName": "Home",
        "icon": null,
        "navigation": {
            "URI": null,
            "type": "CUSTOM",
            "target": "home",
            "depth": null,
            "data": null,
            "filters": {},
            "urlStructure": {
                "title": null,
                "isFeatured": false,
                "isCampaign": false
            }
        },
        "styles": []
    },
    {
        "name": "New In",
        "navigationName": "New In",
        "icon": null,
        "navigation": {
            "URI": null,
            "type": "NO_LINK",
            "target": "",
            "depth": null,
            "data": null,
            "filters": {},
            "urlStructure": {
                "title": null,
                "isFeatured": false,
                "isCampaign": false
            }
        },
        "styles": [
            "linkNewin"
        ],
        "children": [
            {
                "name": "New In Mens",
                "navigationName": "New In Mens",
                "icon": null,
                "navigation": {
                    "URI": "/men?facet:new=latest&sort=latest",
                    "type": "CATEGORY",
                    "target": "men",
                    "depth": null,
                    "data": null,
                    "filters": {
                        "facet:new": "latest",
                        "sort": "latest"
                    },
                    "urlStructure": {
                        "title": null,
                        "isFeatured": false,
                        "isCampaign": false
                    }
                },
                "styles": [
                    "linkNewin"
                ]
            },

那是json数据。我已经解析并填充了nav数组中的名字,但是不能为Children数组做名字。

到目前为止,我已经创建了此数据模型:

struct Menu: Codable {
    var nav = [Menus]()
}

struct Menus: Codable {
    var name: String
    var children: ChildrensNames
}

struct ChildrensNames: Codable {
    var name: String
}

有人有什么想法吗?

我已经有了这些结构,因此当我在其中添加断点时可以看到孩子的名字,但是我不知道如何访问它们并将它们添加到第二部分。下面是我设置的表格视图< / p>

extension MenuViewController: UITableViewDataSource {

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    if section == 0{
    return self.menu?.nav.count ?? 0
    } else if section == 1 {
        return self.menuItems?.children?.count ?? 0
    } else {
        return 2
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    var cell = tableView.dequeueReusableCell(withIdentifier: "cell")

    if cell == nil {
        cell = UITableViewCell.init(style: .value1, reuseIdentifier: "cell")
    }

    let navItem = self.menu?.nav[indexPath.row].name
    let childItem = self.menu?.nav[indexPath.row].children


    switch indexPath.section {
    case 0:
        cell?.textLabel?.text = navItem
        break
    case 1:
//      cell?.textLabel?.text =

        break
    default:
        break
}


    cell?.accessoryView = UIImageView(image: UIImage(named: "icons8-chevron-right-50"))


    return cell!
}

}

3 个答案:

答案 0 :(得分:1)

首先,让我们重命名Menus以避免混淆。我们将其命名为NavigationItem

children的值也是NavigationItem的数组,并且由于某些词典没有子项,因此使其成为可选。

如果结构是只读的,则仅采用Decodable并将结构成员声明为常量。

struct Menu: Decodable {
    let nav : [NavigationItem] // Don't declare this struct member as empty array
}

struct NavigationItem : Decodable {
    let name : String
    let navigationName : String
    let children : [NavigationItem]?
}

答案 1 :(得分:0)

在JSON数据中,“子级”是一个数组,因此您可以尝试以下操作:

struct Menus: Codable {
    var name: String
    var children: [ChildrensNames]  
}

最良好的祝愿!

答案 2 :(得分:0)

尝试此解决方案-为了正确解码,您需要成功定义数据提供者:

struct Nav: Decodable {
 let nav: [NavItem]
}

struct NavItem: Decodable {
  var name : String?
  var navigationName : String?
  var children: [ChildrenArr]
  //And so on
}

然后您可以将其编码如下:

do {
     let nav = try JSONDecoder().decode(Nav.self, from: data)
     //Do somthing
    } catch let error{
        print(error)
    }

因此表视图应如下所示:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let sectionHeaderCell = tableView.dequeueReusableCell(withIdentifier: "Section") as! SectionTableViewCell

    sectionHeaderCell.name.text = nav?.nav[section].name

    return sectionHeaderCell
}

func numberOfSections(in tableView: UITableView) -> Int {
    return self.nav?.nav.count ?? 0
}



 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.nav?.nav[section]. children.count ?? 0
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! ChildTableViewCell

    cell.name.text = self.nav?.nav[indexPath.section]. children[indexPath.row]

    return cell
}

arr推荐给children数组 希望这会有所帮助