我环顾了好几天,无法弄清楚如何使用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
}
}
答案 0 :(得分:0)
您的代码看起来很合理。我注意到的一件事是,一旦完成JSON下载,你就不会调用tableView的reloadData()方法。
以下是我的想法:
您在viewDidLoad中启动异步下载。在数据下载之前立即返回。
您的表视图调用它的数据源方法,以查看有多少部分数据和行/部分可用。据说没有数据。
然后你的完成代码触发,但表视图仍然认为没有数据。如果在完成块的末尾添加reloadData()调用,表视图将再次调用您的数据源方法,发现现在有数据要显示,并绘制您的内容。