Swift:使用JSON数据填充UITableView?

时间:2015-06-08 19:07:47

标签: ios json uitableview swift

我环顾了好几天,无法弄清楚如何使用JSON数据填充UITableView。我将值附加到recommendedTitles数组和recommendedThumbnails数组,我可以使用索引将它们关联在一起。

我没有收到任何错误,只是没有得到任何结果。我错过了什么或做错了吗?

class RecommendationCell: UITableViewCell {

    @IBOutlet weak var recommendationTitle: UILabel!

}

class SongViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var recommendedTitles = [String]()
    var recommendedImages = [String]()

    override func viewDidLoad() {
            super.viewDidLoad()

                let url = NSURL(string: "https://www.googleapis.com/youtube/v3/search?part=id&q=\(searchTerm)&maxResults=1&key=AIzaSyD7PxAoq0O5hUxx775l_E_mnowlU4cUfcI")

                let task = NSURLSession.sharedSession().dataTaskWithURL(url!,  completionHandler: {data, response, error -> Void in

                    if error != nil {

                        println(error)

                    } else {

                        let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary

                            if let items = jsonResult["items"] as? NSArray {

                            // yada yada yada...

                                self.recommendedTitles.append(title)
                                self.recommendedImages.append(thumbnail)

                 })
                     newTask.resume()
    }

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


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

            var songCell = tableView.dequeueReusableCellWithIdentifier("songCell", forIndexPath: indexPath) as! RecommendationCell

            songCell.recommendationTitle.text = recommendedTitles[indexPath.row]

            return songCell
        }
}

1 个答案:

答案 0 :(得分:0)

您的代码看起来很合理。我注意到的一件事是,一旦完成JSON下载,你就不会调用tableView的reloadData()方法。

以下是我的想法:

您在viewDidLoad中启动异步下载。在数据下载之前立即返回。

您的表视图调用它的数据源方法,以查看有多少部分数据和行/部分可用。据说没有数据。

然后你的完成代码触发,但表视图仍然认为没有数据。如果在完成块的末尾添加reloadData()调用,表视图将再次调用您的数据源方法,发现现在有数据要显示,并绘制您的内容。