无法将已解析 JSON 的列表显示到 TableView 中
Can't show list of parsed JSON into TableView
我是 swift 的新手,不知道为什么 UITableView
不显示来自 JSON
数组的动态数据。
我想使用 swiftyJSON
从 iTunes 获取热门应用列表,然后根据解析的数据创建一个动态的 table。
我的问题是当我 运行 我用下面的代码得到的所有代码是 5 行,其中的值相同,如下图
我怎样才能使它动态化以及我在哪里弄错了?
提前致谢。
更新代码:
import UIKit
struct Apps {
var name : String!
}
class createTable: UITableViewController {
var tableData = [Apps]()
//Mark Properties
@IBOutlet var appTableView : UITableView!
override func viewDidLoad() {
super.viewDidLoad()
//Get the #1 app name from iTunes and SwiftyJSON
DataManager.getTopAppsDataFromItunesWithSuccess { (iTunesData) -> Void in
let json = JSON(data: iTunesData)
if let appArray = json["feed"]["entry"].array {
for appDict in appArray {
let appName : String! = appDict["im:name"]["label"].string
let ap = Apps(name: appName)
self.tableData.append(ap)
}
}
}
self.tableView.reloadData()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.tableData.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
//Table view cells are reused and should be dequeued using a cell identifier.
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
let rowData = self.tableData[indexPath.row]
cell.textLabel!.text = rowData.name
return cell
}
}
输出:
不要请求 cellForRowAtIndexPath
中的数据。请求数据例如 viewDidLoad
和 trigger a reload
的 tableview.
创建一个包含所需数据的自定义 class,创建这些自定义 class 的数组,为每个单元格使用该自定义 class 的一个元素。
什么是
var appName : String!
if let appArray = json["feed"]["entry"].array {
for appDict in appArray {
appName = appDict["im:name"]["label"].string
}
}
cell.textLabel!.text = appName
应该怎么办?您 运行 为 每个 单元格编写代码。您总是多次分配 appName
。 appName
总是最后找到的姓氏。因此所有标签都将获得相同的文本集。
解决方案总结。
- 创建一个 class
App
其中包含一个 属性 name
(稍后更多)
- 从您的
viewDidLoad
中的 AppStore 请求数据
- 解析检索到的数据,创建
App
的实例,每个实例都设置了名称,将这些实例存储在数组中 var apps = [App]()
- 触发 tableView 的重新加载
- 在你的
cellForRowAtIndexPath
中检索对应于单元格索引 的App
return apps.count
在你的 numberOfRowsInSection
里面
Reload 应该在闭包内调用。 DataManager
异步获取应用列表,数据解析后不调用刷新
override func viewDidLoad() {
super.viewDidLoad()
//Get the #1 app name from iTunes and SwiftyJSON
DataManager.getTopAppsDataFromItunesWithSuccess { (iTunesData) -> Void in
let json = JSON(data: iTunesData)
if let appArray = json["feed"]["entry"].array {
for appDict in appArray {
let appName : String! = appDict["im:name"]["label"].string
let ap = Apps(name: appName)
self.tableData.append(ap)
}
}
tableView.reloadData()
}
}
我正在为那些想要使用它的人发布结果代码。
代码:
//
// createTable.swift
// TopApps
import UIKit
struct Apps {
var name : String!
}
class createTable: UITableViewController {
var tableData = [Apps]()
//Mark Properties
@IBOutlet var appTableView : UITableView!
override func viewDidLoad() {
super.viewDidLoad()
//Get the #1 app name from iTunes and SwiftyJSON
DataManager.getTopAppsDataFromItunesWithSuccess { (iTunesData) -> Void in
let json = JSON(data: iTunesData)
if let appArray = json["feed"]["entry"].array {
for appDict in appArray {
let appName : String! = appDict["im:name"]["label"].string
let ap = Apps(name: appName)
self.tableData.append(ap)
self.tableView.reloadData()
}
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.tableData.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
//Table view cells are reused and should be dequeued using a cell identifier.
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
let rowData = self.tableData[indexPath.row]
cell.textLabel!.text = rowData.name
return cell
}
}
输出:
我是 swift 的新手,不知道为什么 UITableView
不显示来自 JSON
数组的动态数据。
我想使用 swiftyJSON
从 iTunes 获取热门应用列表,然后根据解析的数据创建一个动态的 table。
我的问题是当我 运行 我用下面的代码得到的所有代码是 5 行,其中的值相同,如下图
我怎样才能使它动态化以及我在哪里弄错了? 提前致谢。
更新代码:
import UIKit
struct Apps {
var name : String!
}
class createTable: UITableViewController {
var tableData = [Apps]()
//Mark Properties
@IBOutlet var appTableView : UITableView!
override func viewDidLoad() {
super.viewDidLoad()
//Get the #1 app name from iTunes and SwiftyJSON
DataManager.getTopAppsDataFromItunesWithSuccess { (iTunesData) -> Void in
let json = JSON(data: iTunesData)
if let appArray = json["feed"]["entry"].array {
for appDict in appArray {
let appName : String! = appDict["im:name"]["label"].string
let ap = Apps(name: appName)
self.tableData.append(ap)
}
}
}
self.tableView.reloadData()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.tableData.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
//Table view cells are reused and should be dequeued using a cell identifier.
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
let rowData = self.tableData[indexPath.row]
cell.textLabel!.text = rowData.name
return cell
}
}
输出:
不要请求 cellForRowAtIndexPath
中的数据。请求数据例如 viewDidLoad
和 trigger a reload
的 tableview.
创建一个包含所需数据的自定义 class,创建这些自定义 class 的数组,为每个单元格使用该自定义 class 的一个元素。
什么是
var appName : String!
if let appArray = json["feed"]["entry"].array {
for appDict in appArray {
appName = appDict["im:name"]["label"].string
}
}
cell.textLabel!.text = appName
应该怎么办?您 运行 为 每个 单元格编写代码。您总是多次分配 appName
。 appName
总是最后找到的姓氏。因此所有标签都将获得相同的文本集。
解决方案总结。
- 创建一个 class
App
其中包含一个 属性name
(稍后更多) - 从您的
viewDidLoad
中的 AppStore 请求数据
- 解析检索到的数据,创建
App
的实例,每个实例都设置了名称,将这些实例存储在数组中var apps = [App]()
- 触发 tableView 的重新加载
- 在你的
cellForRowAtIndexPath
中检索对应于单元格索引 的 return apps.count
在你的numberOfRowsInSection
里面
App
Reload 应该在闭包内调用。 DataManager
异步获取应用列表,数据解析后不调用刷新
override func viewDidLoad() {
super.viewDidLoad()
//Get the #1 app name from iTunes and SwiftyJSON
DataManager.getTopAppsDataFromItunesWithSuccess { (iTunesData) -> Void in
let json = JSON(data: iTunesData)
if let appArray = json["feed"]["entry"].array {
for appDict in appArray {
let appName : String! = appDict["im:name"]["label"].string
let ap = Apps(name: appName)
self.tableData.append(ap)
}
}
tableView.reloadData()
}
}
我正在为那些想要使用它的人发布结果代码。
代码:
//
// createTable.swift
// TopApps
import UIKit
struct Apps {
var name : String!
}
class createTable: UITableViewController {
var tableData = [Apps]()
//Mark Properties
@IBOutlet var appTableView : UITableView!
override func viewDidLoad() {
super.viewDidLoad()
//Get the #1 app name from iTunes and SwiftyJSON
DataManager.getTopAppsDataFromItunesWithSuccess { (iTunesData) -> Void in
let json = JSON(data: iTunesData)
if let appArray = json["feed"]["entry"].array {
for appDict in appArray {
let appName : String! = appDict["im:name"]["label"].string
let ap = Apps(name: appName)
self.tableData.append(ap)
self.tableView.reloadData()
}
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.tableData.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
//Table view cells are reused and should be dequeued using a cell identifier.
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
let rowData = self.tableData[indexPath.row]
cell.textLabel!.text = rowData.name
return cell
}
}
输出: