我是swift的新手,不知道为什么UITableView
没有显示来自JSON
数组的动态数据。
我希望使用swiftyJSON
从ITunes获取顶级应用列表,然后根据解析后的数据创建动态表。
我的问题是,当我运行此代码时,我得到的所有代码都是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
}
}
输出:
答案 0 :(得分:4)
请勿在{{1}}内请求数据。例如,在cellForRowAtIndexPath
和触发 viewDidLoad
的tableview中请求数据。
创建一个包含所需数据的自定义类,创建这些自定义类的数组,为每个单元格使用该自定义类的一个元素。
什么是
reload
应该怎么做?您为每个单元格运行该代码。您总是多次分配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
(稍后更多)App
name
viewDidLoad
的实例,每个实例都设置其名称,将这些实例存储在数组中App
var apps = [App]()
中的cellForRowAtIndexPath
App
中return apps.count
答案 1 :(得分:1)
应该在封闭内部调用重新加载。 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()
}
}
答案 2 :(得分:0)
我正在为想要使用它的人发布结果代码。
代码:
//
// 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
}
}
输出: