заполнение табличного представления с помощью json data swift 4 - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть данные json, и я могу проанализировать первую часть, которая называется nav и name, однако мне нужно проанализировать массив 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
}

У кого-нибудь есть идеи?

У меня работают структуры, поэтому при добавлении точки останова вЯ могу видеть имена детей, однако я не знаю, как получить к ним доступ и добавить их во второй раздел. Ниже приведено мое табличное представление

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 голосов
/ 18 ноября 2018

Прежде всего давайте переименуем 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]?
}
0 голосов
/ 18 ноября 2018

Попробуйте это решение - для правильного декодирования необходимо успешно определить поставщика данных:

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, надеюсь, это поможет

0 голосов
/ 18 ноября 2018

В данных JSON «дети» - это массив ,, поэтому вы можете попробовать это:

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

С наилучшими пожеланиями!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...