用 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循环来迭代nav
和children
让 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 填充表视图的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 中使用远程 JSON 数据填充 tableView
如何使用 Alamofire,Swift 4 为 UICollectionView 获取 JSON 数据