gpt4 book ai didi

arrays - 在 TableView Swift 4 中填充 JSON 数据

转载 作者:行者123 更新时间:2023-11-28 07:27:40 25 4
gpt4 key购买 nike

我有 json 数据,我可以解析第一部分,即导航和名称,但是我需要将数组子项解析为 TableView 。

{
"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: [Child]?


}

struct Child: Codable {
var name: String
}

有没有人有什么想法?

我已经让结构正常工作,所以当我添加一个断点时,我可以看到 child 的名字,但是我不知道如何访问这些并将它们添加到第二部分。下面是我的 TableView 设置

extension MenuViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 32
}

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]
// cell?.det?.text = self.menu?.nav[indexPath.row].children?[indexPath.row].name


return cell!
}


}

最佳答案

我不确定如何处理你的问题,因为你没有提供足够的背景和信息,所以我将假设某些事情并给你一个答案。让我们开始吧!

看起来子节点是一个 Nav 数组,所以我创建了以下结构:

struct Menu: Codable {
let nav: [Nav]

func getMenu(_ parent: String? = nil) -> [Nav] {
if parent == nil {
return nav
} else {
let option =
nav.compactMap { $0 }
.first { $0.name == parent }
if let children = option?.children {
return children
} else {
return []
}
}
}
}

struct Nav: Codable {
let name, navigationName: String
let icon: String?
let navigation: Navigation
let styles: [String]
let children: [Nav]?
}

struct Navigation: Codable {
let URI: String?
let type: String
let target: String
let depth: Int?
let data: String?
let filter: [String:String]?
let urlStructure: UrlStructure
}

struct UrlStructure: Codable {
let title: String?
let isFeatured: Bool
let isCampaign: Bool
}

Menu 中,我创建了一个 getMenu 方法。如果没有提供参数,它会返回顶级菜单,否则它会尝试找到一个 Nav,其 name 属性等于发送的参数。要解码您的 json,请使用以下接收 JSON 字符串并返回 Menu 的方法:

func decodeJson(_ jsonString: String) -> Menu {
let decoder = JSONDecoder()
// Try to get JSON from String to Data
guard let jsonData = jsonString.data(using: .utf8) else { return Menu() }
do {
return try decoder.decode(Menu.self, from: jsonData)
} catch { // Decode, if bad JSON return empty Menu
return Menu()
}
}

这就是将您的 JSON 解码为 Menu 结构的全部内容,现在让我们处理 UI 部分。在您的 viewDidload 或您的 ViewController 中的任何其他入口点中,您需要将 JSON 转换为 Menu 结构。为 Menu 定义一个变量和一个具有当前菜单名称的可选 String 变量。

var menu: Menu!
var currentMenuOption: String? = nil

然后用您的 JSON 字符串初始化您的 navigationMenu:

let navigationMenu = decodeJson(jsonString)

完成所有这些之后,您的扩展应该如下所示:

extension MenuViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return navigationMenu.getMenu(currentMenuOption).count
}

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.getMenu(currentMenuOption)[indexPath.row]
cell?.det?.text = navItem.name
return cell!
}

如果用户选择一行,您必须使用行文本设置 currentMenuOption 并重新加载表格。此实现试图避免尽可能少地更改您的代码。希望这对你有用,或者至少让你知道如何解决它:)

关于arrays - 在 TableView Swift 4 中填充 JSON 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55958672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com