tableView没有在swift中显示来自JSON的数据

时间:2014-12-31 09:54:23

标签: ios json swift

我正在解析来自HERE的JSON数据。

因为我使用了这段代码。

DataManager.swift

import Foundation

let TopAppURL = "http://api.feedzilla.com/v1/categories.json"

class DataManager {

class func getTopAppsDataFromItunesWithSuccess(success: ((iTunesData: NSData!) -> Void)) {
    //1
    loadDataFromURL(NSURL(string: TopAppURL)!, completion:{(data, error) -> Void in
        //2
        if let urlData = data {
            //3
            success(iTunesData: urlData)
        }
    })
}

class func loadDataFromURL(url: NSURL, completion:(data: NSData?, error: NSError?) -> Void) {
var session = NSURLSession.sharedSession()

// Use NSURLSession to get data from an NSURL
let loadDataTask = session.dataTaskWithURL(url, completionHandler: { (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in
  if let responseError = error {
    completion(data: nil, error: responseError)
  } else if let httpResponse = response as? NSHTTPURLResponse {
    if httpResponse.statusCode != 200 {
      var statusError = NSError(domain:"com.raywenderlich", code:httpResponse.statusCode, userInfo:[NSLocalizedDescriptionKey : "HTTP status code has unexpected value."])
      completion(data: nil, error: statusError)
    } else {
      completion(data: data, error: nil)
    }
  }
})

loadDataTask.resume()
 }
}

ViewController.swift

import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

var i = 0
var detailid = [Int]()
var detailCat = [String]()
var tableData = ["1","2","3"]

@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()

DataManager.getTopAppsDataFromItunesWithSuccess { (iTunesData) -> Void in

    let json = JSON(data: iTunesData)

    if let array = json.arrayValue{

        for Dict in array{
            var id : Int = array[self.i]["category_id"].integerValue!
            var category : String = array[self.i]["english_category_name"].stringValue!
            self.detailid.append(id)
            self.detailCat.append(category)

            self.i++

        }
        println(self.detailid)
        println(self.detailCat)
    }
}


}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{

    return self.detailCat.count
}


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{

    var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell
    cell.textLabel.text = self.detailCat[indexPath.row]
    return cell

   }

}

在控制台中我得到的数据如下:

[1314, 13, 21, 22, 5, 588, 6, 17, 25, 1168, 11, 14, 2, 28, 15, 33, 591, 20, 29, 36, 3, 10, 16, 18, 8, 34, 4, 27, 30, 31, 26, 23, 12, 7, 590, 9, 19]
[Sports, Art, Blogs, Business, Celebrities, Columnists, Entertainment, Events, Fun Stuff, General, Health, Hobbies, Industry, Internet, IT, Jobs, Law, Life Style, Music, Oddly Enough, Politics, Products, Programming, Religion And Spirituality, Science, Shopping, Society, Sports, Technology, Top Blogs, Top News, Travel, Universities, USA, Video, Video Games, World News]

但它没有将其打印到tableView

我错过了什么?请帮助我。

2 个答案:

答案 0 :(得分:5)

viewDidLoad中的 for loop 完成后,您获得了数据,您必须致电:

tableView.reloadData()

答案 1 :(得分:0)

我也关注我的iOS应用程序的Ray教程,发现数据管理器无法在for循环之外传递数据。所以我用另一种方法来解析swiftyJSON。我花了一天时间搞清楚这一点。所以与我分享我的解决方案。我调用一个url来获取json数据和json中的医院坐标列表,并在解析数据后将位置添加到mapKit。

让locationURL = NSURL(字符串:" http:你的网址")         var request = NSURLRequest(URL:locationURL!)         var data = NSURLConnection.sendSynchronousRequest(request,returningResponse:nil,error:nil)

    let json = JSON(data: data!)

    if let appArray = json.array {

            for appDict in appArray {
                var appName: String? = appDict["title"].string
                var appLocation: String? = appDict["locationName"].string
                var dLatitude: Double? = appDict["latitude"].doubleValue
                var dLongitude: Double? = appDict["longitude"].doubleValue
                var coordinate: CLLocationCoordinate2D? = CLLocationCoordinate2D(latitude: dLatitude!, longitude: dLongitude!)


                hospital = HospitalModel(title: appName!,
                    locationName: appLocation!,
                    coordinate: CLLocationCoordinate2D(latitude: dLatitude!, longitude: dLongitude!))

                hoslist.append(hospital)

            }
            mapView.addAnnotations(hoslist)

        }

    mapView.addAnnotations(hoslist)

    }