动态表视图不显示来自 API 调用的 JSON 数据的文本
Dynamic UITable View not displaying text with JSON data from API call
所以我连接到这个 API 并使用 ALAMOFIRE 和 SWIFTYJSON 从中检索一些数据,然后将其显示到 UItable 视图:
这是示例 JSON Return:
{
"status" : "success",
"countries" : [
{
"name" : "Åland Islands",
"flag" : "https:\/\/1fx.cash\/\/flags\/europe.png",
"currency_code" : "EUR",
"country_iso3" : "ALA",
"country_code" : "AX"
},
{
"name" : "American Samoa",
"flag" : "https:\/\/1fx.cash\/\/flags\/usa.png",
"currency_code" : "USD",
"country_iso3" : "ASM",
"country_code" : "AS"
},
{
"name" : "Virgin Islands, U.S.",
"flag" : "https:\/\/1fx.cash\/\/flags\/usa.png",
"currency_code" : "USD",
"country_iso3" : "VIR",
"country_code" : "VI"
}
]
}
这是我的全部 viewcontroller:
import UIKit
import Alamofire
import SwiftyJSON
class addCountry: UIViewController, UITableViewDataSource, UITableViewDelegate {
var datas: [JSON] = []
@IBOutlet var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
Alamofire.request(.GET, "https://sample.com/countries").responseJSON { (request, response, json, error) in
if json != nil {
var jsonObj = JSON(json!)
if let data = jsonObj["countries"].arrayValue as [JSON]?{
self.datas = data
self.tableView.reloadData()
}
}
}
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.datas.count;
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell:UITableViewCell=UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "cell")
let data = datas[indexPath.row]
if let caption = data["countries"]["name"].string{
cell.textLabel?.text = caption
}
return cell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
let row = datas[indexPath.row]
println(row)
}
}
当我运行它时,它不显示任何东西。
我使用了 println(row) 所以当我 select 一个单元格时,它会在控制台上打印一个数据以显示那里确实有数据,而且确实有。
我只是无法在 UItable 视图中显示它们。
谁能帮帮我?提前致谢! :)
我认为你需要添加这个:
self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
在
override func viewDidLoad() {
...
}
问题与您的数据结构以及您在 cellForRowAtIndexPath
中过滤它的方式有关。
首先,您使用 let data = datas[indexPath.row]
筛选出一个国家/地区,这会为您提供如下数据集:
{
"name" : "Åland Islands",
"flag" : "https:\/\/1fx.cash\/\/flags\/europe.png",
"currency_code" : "EUR",
"country_iso3" : "ALA",
"country_code" : "AX"
}
之后您尝试访问其中的 countries
属性 和 name
属性。唯一的问题是,上面的代码片段中不存在 countries
属性。
相反,您需要像下面的代码一样直接访问 name
属性:
if let caption = data["name"].string{
cell.textLabel?.text = caption
}
所以我连接到这个 API 并使用 ALAMOFIRE 和 SWIFTYJSON 从中检索一些数据,然后将其显示到 UItable 视图:
这是示例 JSON Return:
{
"status" : "success",
"countries" : [
{
"name" : "Åland Islands",
"flag" : "https:\/\/1fx.cash\/\/flags\/europe.png",
"currency_code" : "EUR",
"country_iso3" : "ALA",
"country_code" : "AX"
},
{
"name" : "American Samoa",
"flag" : "https:\/\/1fx.cash\/\/flags\/usa.png",
"currency_code" : "USD",
"country_iso3" : "ASM",
"country_code" : "AS"
},
{
"name" : "Virgin Islands, U.S.",
"flag" : "https:\/\/1fx.cash\/\/flags\/usa.png",
"currency_code" : "USD",
"country_iso3" : "VIR",
"country_code" : "VI"
}
]
}
这是我的全部 viewcontroller:
import UIKit
import Alamofire
import SwiftyJSON
class addCountry: UIViewController, UITableViewDataSource, UITableViewDelegate {
var datas: [JSON] = []
@IBOutlet var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
Alamofire.request(.GET, "https://sample.com/countries").responseJSON { (request, response, json, error) in
if json != nil {
var jsonObj = JSON(json!)
if let data = jsonObj["countries"].arrayValue as [JSON]?{
self.datas = data
self.tableView.reloadData()
}
}
}
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.datas.count;
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell:UITableViewCell=UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "cell")
let data = datas[indexPath.row]
if let caption = data["countries"]["name"].string{
cell.textLabel?.text = caption
}
return cell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
let row = datas[indexPath.row]
println(row)
}
}
当我运行它时,它不显示任何东西。
我使用了 println(row) 所以当我 select 一个单元格时,它会在控制台上打印一个数据以显示那里确实有数据,而且确实有。
我只是无法在 UItable 视图中显示它们。
谁能帮帮我?提前致谢! :)
我认为你需要添加这个:
self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
在
override func viewDidLoad() {
...
}
问题与您的数据结构以及您在 cellForRowAtIndexPath
中过滤它的方式有关。
首先,您使用 let data = datas[indexPath.row]
筛选出一个国家/地区,这会为您提供如下数据集:
{
"name" : "Åland Islands",
"flag" : "https:\/\/1fx.cash\/\/flags\/europe.png",
"currency_code" : "EUR",
"country_iso3" : "ALA",
"country_code" : "AX"
}
之后您尝试访问其中的 countries
属性 和 name
属性。唯一的问题是,上面的代码片段中不存在 countries
属性。
相反,您需要像下面的代码一样直接访问 name
属性:
if let caption = data["name"].string{
cell.textLabel?.text = caption
}