用 json 数据 swift 4 填充表视图

Posted

技术标签:

【中文标题】用 json 数据 swift 4 填充表视图【英文标题】:populating table view with json data swift 4 【发布时间】:2018-11-18 01:39:19 【问题描述】:

我有 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数据。我已经解析并填充了数组导航中的名字,但无法为 Children 数组执行此操作。

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

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


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


struct ChildrensNames: Codable 
    var name: String

有人有什么想法吗?

我已经让结构正常工作,所以当我在其中添加断点时,我可以看到孩子的名字,但是我不知道如何访问这些并将它们添加到第二部分。下面是我的表格视图设置

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!

【问题讨论】:

Parsing nested JSON using Codable的可能重复 【参考方案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]?

【讨论】:

好的,我已经做到了,我将如何从孩子那里获取数据并将其填充到表格视图中? 取决于表视图的数据源结构。基本上使用两个for循环来迭代navchildren 让 navItem = self.menu?.nav[indexPath.row].name switch indexPath.section case 0: cell?.textLabel?.text = navItem break case 1: for _ in navItem! if self.menu?.nav[indexPath.row].children == nil 返回单元格! else 对于 childItems 中的孩子! 单元格?.textLabel?.text = 这是我现在必须填充表格的内容,我可以填充导航名称但不能填充子名称 请edit您的问题,添加代码和有关表格视图的预期部分和行的描述。【参考方案2】:

在 JSON 数据中,“children”是一个数组,你可以试试这个:

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

祝你好运!

【讨论】:

【参考方案3】:

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

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)
    

所以 tableview 应该是这样的:

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 数组显示在不同的部分,所以当我可以显示它们时,我将把它变成一个可扩展的表格视图 这是你的孩子吗?: "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": [] 对我来说孩子是:`"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, ]

以上是关于用 json 数据 swift 4 填充表视图的主要内容,如果未能解决你的问题,请参考以下文章

3.复杂查询

在 Swift 中使用远程 JSON 数据填充 tableView

如何使用 Alamofire,Swift 4 为 UICollectionView 获取 JSON 数据

如何使用 Ajax 获取 MVC Json 结果并填充到表中

解析 JSON Swift TableView

用 json 填充 CanvasJS