将JSON解析为tableview

时间:2015-08-29 06:16:30

标签: ios json swift uitableview

我从远程服务器收到JSON文件,我可以在标签中显示结果。当我调用函数processJSONData()时,JSON数据工作正常,并且tableview适用于一个简单的数组。如何将两者合并以显示tableview中JSON文件的结果?请查看下面的代码并进行编辑。非常感谢:

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
    }
}

3 个答案:

答案 0 :(得分:2)

我没有看到你将解析结果分配给全球"项目"并在任何地方使用新数据重新加载tableview。

可以在这里完成

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

///the rest of the code
            }

答案 1 :(得分:1)

您必须将JSON数据保存到类级变量中,您将在任何函数之外定义该变量,类似于您定义“items”的方式。假设您有一个具有每个资本的国家/地区列表,这可能是这样的:

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),在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].namecountryAndCapitalData[indexPath.row].capital填充单元格标签。

最后,请务必在循环后重新加载表格(感谢Eugene):

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

为任何编译错误道歉,因为我是从Windows机器输入的。

答案 2 :(得分:1)

您应该在items方法调用中更新abc属性,然后刷新表格:

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

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