2015-08-29 3 views
2

Я получаю файл JSON с удаленного сервера, и я могу отобразить результат в метке. Данные JSON работают нормально, когда я вызываю функцию processJSONData(), и tableview отлично работает с простым массивом. Как я могу включить оба для отображения результата из файла JSON в представлении таблицы? Пожалуйста, просмотрите приведенный ниже код и отредактируйте его. Большое спасибо:Parsing JSON в tableview

import UIKit 

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    @IBOutlet weak var countryLabel: UILabel! 
    @IBOutlet weak var capitalLabel: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     //processJSONData() 
        self.myTableView.registerClass(UITableViewCell.self,forCellReuseIdentifier: "cell") 
     self.myTableView.dataSource = self 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    func processJSONData(){ 
     let urlPath = "http://dubaisinan.host22.com/service1.php" 
     let url : NSURL = NSURL(string: urlPath)! 
     let session = NSURLSession.sharedSession() 

     let task = session.dataTaskWithURL(url,completionHandler: {(data, respose, error) -> Void in 
      if error != nil { 
       println(error) 
      } 
      else { 
        self.abc(data) 
      } 
     }) 
     task.resume() 
    } 


    func abc(data:NSData) 
    { 
     var parseError: NSError? 

     let result:AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &parseError); 

     if(parseError == nil){ 
      if let dictResult = result as? NSArray{ 

       dispatch_async(dispatch_get_main_queue()) { 
       self.countryLabel.text = dictResult[2]["Capital"] as? String 
       } 
      } 
     } 
    } 

    @IBOutlet weak var myTableView: UITableView! 

    var items = ["One","Two", "Three","Four"] 

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


    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     var cell:UITableViewCell = self.myTableView 

     .dequeueReusableCellWithIdentifier("cell") as UITableViewCell 

     cell.textLabel?.text = self.items[indexPath.row] 
     return cell 
    } 
} 
+0

Этот вопрос сбивает с толку. Вы просто хотите добавить или использовать дополнительные поля в ячейке просмотра таблицы с данными? –

+0

Привет, Майкл, я просто хочу отобразить следующий результат JSON из удаленного db в tableview: [{«Страна»: «Канада», «Капитал»: «Отава»}, {«Страна»: «Франция», Капитал ":" Париж "}, {" Страна ":" Англия», "Столица": "Лондон"}]. Как я уже упоминал, файл JSON работает нормально, и один из элементов может отображаться на ярлыке. Как я могу отобразить информацию в виде таблицы? Спасибо. – Simon

+1

Это полностью зависит от того, как вы хотите, чтобы ваши камеры выглядели и какую информацию вы хотите отображать. Отправьте свой пример JSON в вопрос и, возможно, покажите, как вы хотите, чтобы ваша ячейка таблицы выглядела. –

ответ

1

Вы должны сохранить данные в формате JSON в переменный классе уровня, который вы будете определять вне какой-либо функции, подобно тому, как вы определили «пункты». Если у вас есть список стран с капиталом каждого, это может выглядеть так:

var countryAndCapitalData = [(country: String, capital: String)]() 

Это может быть улучшена за счет первого определения-структуру, чтобы содержать ваши данные:

struct CountryInfo 
{ 
    name: String 
    capital: String 
    init(name:String, capital:String) 
    { 
     self.name = name 
     self.capital = capital 
    } 
} 

, который позволяет вам определить свой массив данных в виде массива CountryInfo:

var countryAndCapitalData = [CountryInfo]() 

Затем в функции «ABC» (который я настаиваю, чтобы вы переименовать что-то вроде processCountryData), хранить пары Кантра y name + имена в строке countryAndCapitalData. Например:

countryAndCapitalData.append(CountryInfo(countryName, capitalName)) 

Используйте цикл For для циклического преобразования значений в dictResult. Создание COUNTRYNAME и capitalName зависит от структуры вашего JSON, но из вашего примера это может выглядеть следующим образом:

for countryDictionary in dictResult[2] 
{ 
    if let countryName = countryDictionary["country"], let capitalName = countryDictionary["capital"] 
    { 
     countryAndCapitalData.append(CountryInfo(countryName, capitalName)) 
    } 
} 

Затем в tableView.cellForRowAtIndexPath, заполнить метку (ы) клеток с countryAndCapitalData[indexPath.row].name и countryAndCapitalData[indexPath.row].capital.

И, наконец, не забудьте перезагрузить таблицу после цикла (спасибо Евгению):

dispatch_async(dispatch_get_main_queue()) { 
    self.myTableView.reloadData() 
} 

Извиняюсь за любые ошибки компиляции, поскольку я печатаю это от машины Windows.

+0

Спасибо Skypecakes. Могу ли я попросить вас изменить приведенный выше код, чтобы вставить предлагаемые изменения. – Simon

+0

Как насчет того, чтобы вы дали ему попробовать и сообщите нам, с какими проблемами вы столкнулись?Вы поймете это лучше, если вы сделаете это сами. – stone

+0

Спасибо, что неспешно. self.myTableView.reloadData() решил проблему. – Simon

2

Я не вижу, чтобы ваш результат синтаксического анализа присваивался глобальным «элементам» и перезагружал табличное представление новыми данными в любом месте.

можно сделать здесь

if let dictResult = result as? NSArray{ 
    self.items = dictResult 
    self.myTableView.reloadData() 

///the rest of the code 
      } 
+0

Благодарим за информацию Евгения. – Simon

1

Вы должны обновить items свойство в abc вызова метода, а затем обновить таблицу:

func abc(data: NSData) { 
    // Do something with data 
    items = .. // processed data 
} 

var items: [String]? { 
    didSet { 
     NSOperationQueue.mainQueue.addOperationWithBlock { 
      self.tableView.reloadData() 
     } 
    } 
} 
+1

На самом деле, мне нравится этот элегантный способ: и обратите внимание: reloadData() должен быть вызван на главную тему! –