Dynamic UITable View不显示带有来自API调用的JSON数据的文本

时间:2015-07-16 01:53:57

标签: swift uitableview xcode6 alamofire swifty-json

所以我已连接到此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(行)所以当我选择一个单元格时,它会在控制台上打印一个数据,以显示那里确实存在数据,并且存在。

我在UItable视图上显示它们时遇到了麻烦。

任何人都可以帮助我吗?提前致谢! :)

2 个答案:

答案 0 :(得分:2)

问题与您的数据结构以及在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
}

答案 1 :(得分:0)

我认为你需要添加这个:

self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")

in

override func viewDidLoad() {
          ...
}