Dynamic UITable View не отображает текст с данными JSON из вызова API

Итак, я подключен к этому API и получаю от него некоторые данные с помощью ALAMOFIRE и SWIFTYJSON, а затем отображаю их в представлении UItable:

Вот пример возврата JSON:

{
  "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"
    }
  ]
}

А вот и весь мой вьюконтроллер:

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), поэтому, когда я выбираю ячейку, она печатает данные на консоли, чтобы показать, что там действительно есть данные, и они есть.

У меня просто проблемы с отображением их в представлении UItable.

Может кто-нибудь мне помочь? Заранее спасибо! :)


person Community    schedule 16.07.2015    source источник


Ответы (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
}
person Kumuluzz    schedule 16.07.2015
comment
Я просто счастлив, что смог помочь :) - person Kumuluzz; 16.07.2015
comment
еще один вопрос, как мне применить параметр флага? Я хочу показать изображение. Я сделаю новый вопрос, если вы можете это сделать. Спасибо - person ; 20.07.2015
comment
Попробуйте взглянуть на этот ответ StackOverflow, в котором объясняется, как загрузить данные изображения с URL-адреса с помощью Alamofire, используя метод запроса GET. Если у вас все еще есть проблемы, не стесняйтесь задать новый вопрос и опубликовать ссылку здесь, чтобы я мог его увидеть :) - person Kumuluzz; 22.07.2015

Я думаю, вам нужно добавить это:

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

in

override func viewDidLoad() {
          ...
}
person Lyuzonggui    schedule 16.07.2015