2015-06-08 4 views
-1

Я много дней оглядывался и не могу понять, как заполнить данные JSON UITableView. Я добавляю значения в массив recommendedTitles и массив recommendedThumbnails, который я могу связать между ними с помощью индекса.Swift: заполняет UITableView данными JSON?

Я не получаю никаких ошибок, просто не получаю никаких результатов. Я что-то упустил или сделал это неправильно?

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

Ваш код выглядит разумным. Единственное, что я замечаю, это то, что вы не вызываете метод reloadData() вашего tableView после завершения загрузки JSON.

Вот что я думаю, что происходит:

Вы начинаете асинхронную загрузку в вашем viewDidLoad. Это немедленно возвращается, прежде чем данные будут загружены.

В вашем представлении таблицы используются методы источника данных, чтобы узнать, сколько разделов данных и строк/разделов доступно. Говорят, что данных нет.

Тогда ваш код завершения срабатывает, но табличный вид все еще считает, что данных нет. Если вы добавите вызов reloadData() в конце вашего блока завершения, представление таблицы снова вызовет ваши методы источника данных, обнаружите, что теперь есть данные для отображения и рисования вашего содержимого.

+0

Это действительно работало, однако для просмотра таблицы требуется всего 10 секунд для загрузки, если только я не начну вручную прокрутку. Затем он мгновенно появляется. Есть ли способ загрузить это, как только он будет готов? – chicobermuda

+0

Эй, Дункан, могу ли я получить продолжение? – chicobermuda

Смежные вопросы