2015-12-03 4 views
-1

Я пытаюсь отобразить некоторые данные в UITableView, но данные не отображаются в UITableView. Данные форматируются в JSON.Ошибка - показать данные json в tableview swift

код я пишу для отображения в UITableView это:

var mainList:[[String:AnyObject]] = [] 

@IBOutlet var listCountriesTableView: UITableView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view. 
    self.listCountriesTableView.dataSource = self 
    self.listCountriesTableView.delegate = self 

    let urlPath = "http://data.okfn.org/data/core/country-codes/r/country-codes.json" 
    let url = NSURL(string: urlPath) 
    let session = NSURLSession.sharedSession() 
    let task = session.dataTaskWithURL(url!, completionHandler: { data, response, error -> Void in 
     if (error != nil) { 
      print(error) 
     } else { 
      do { 
       let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as! [[String:AnyObject]] 
       for country in jsonResult { 
        let countryName = country["name"]! 
        let countryDial = country["Dial"]! 
        let nameDial = ["name":countryName, "Dial":countryDial] 
        self.mainList.append(nameDial) 

        print(country["name"]!, country["Dial"]!) 
       } 
      } catch let error as NSError { 
       print(error) 
      } 
     } 
    }) 
    task.resume() 
} 

}

extension ListOfCountriesViewController: UITableViewDataSource, UITableViewDelegate { 

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return self.mainList.count 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cellList = tableView.dequeueReusableCellWithIdentifier("cellListCountries")! as UITableViewCell 
    let data = mainList[indexPath.row] 
    let countryTableView = data["name"] 
    let codeTableView = data["Dial"] 
    cellList.textLabel!.text = countryTableView 
    cellList.detailTextLabel!.text = codeTableView 
    return cellList 
} 

print(country["name"]!, country["Dial"]!) показывает мне правильный список стран и набрать код в области отладки, но не отображается в UITableView.

Debug область: Афганистан 93 Албания Алжир 355 Американское Самоа 1-684 Андорра 376 Ангола 244 Ангилья 1-264 Antarctica 672 Антигуа и Барбуда Аргентина 1-268 Армения 374 Aruba 297

Кто-нибудь знает, в чем моя проблема? Спасибо!

+0

Вы называете 'reloadData' где угодно? –

+0

Да. Я положил его после «task.resume()». Кроме того, результат дает мне эти 2 ошибки в «cellList.textLabel! .text» -> Нельзя присвоить значение типа «AnyObject»? набрать 'String?' – JoshV

ответ

0

Ваши данные загружены асинхронно. Когда они готовы, UITableView уже показан. Вот почему вы должны перезагрузить его. Звоните:

[self.listCountriesTableView reloadData]; 

или

self.listCountriesTableView.reloadData() 

только после разбора данных.

+0

Отлично. Я положил его после «task.resume()». Кроме того, результат дает мне эти 2 ошибки в «cellList.textLabel! .text = countryTableView» и «cellList.detailTextLabel! .text = codeTableVie» ---> Невозможно присвоить значение типа «AnyObject»? набрать 'String? – JoshV

+0

@JoshB где вы инициализируете 'self.mainList' ?. Поместите код обновления таблицы после 'for {...}' loop. –

+0

Я назвал 'main_ist: [[String: AnyObject]] = []' в начале кода, а затем добавляю элементы с '.append' в код' for {...} ' – JoshV

Смежные вопросы