我有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!
}
}
答案 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数组 希望这会有所帮助