2016-02-19 18 views
8

次のコードがあります。JSONのtableviewセルにAlamofire(Swift 2)を埋め込む

import UIKit 
import Alamofire 

class CheHappyTableViewController: UITableViewController, NSURLConnectionDelegate { 

    var happyHours = [HappyHour]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     //Load the cell elements 
     loadHappyHourElements() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func loadHappyHourElements(){ 

     let testhappyhour:HappyHour = HappyHour(title: "TEST", image: "TESST", description: "TEST", postedDate: "TEST") 
     self.happyHours.append(testhappyhour) 

     let url:String = "https://gist.githubusercontent.com/arianitp/036133ebb5af317a595c/raw/f134ec241ec3126bedd6debe5de371e3e01d225b/happyhours.json" 
     Alamofire.request(.GET, url, encoding:.JSON).responseJSON 
      { response in switch response.result { 
      case .Success(let JSON): 
       let response = JSON as! NSArray 
       for item in response { // loop through data items 
        let obj = item as! NSDictionary 
        let happyhour = HappyHour(title:obj["title"] as! String, image:obj["image"] as! String, description:obj["description"] as! String, postedDate:obj["date"] as! String) 
        self.happyHours.append(happyhour) 
       } 

      case .Failure(let error): 
       print("Request failed with error: \(error)") 
       } 
     } 
     self.tableView.reloadData() 
    } 

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     // #warning Incomplete implementation, return the number of sections 
     return 1 
    } 

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

    //Displays the cells in the table 
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     self.tableView.rowHeight = UIScreen.mainScreen().bounds.size.width 
     let cellIdentifier = "CheHappyTableViewCellController" 
     let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! CheHappyTableViewCellController 

     let happyHour = happyHours[indexPath.row] 
     cell.lblTitle.text = happyHour.title 
     //cell.cheHappyImage = happyHour.photo 

     // Configure the cell... 
     return cell 
    } 
} 

テーブルセルは、私がAlamofire要求を完全機能にself.tableView.reloadData()を含めていても更新されません。 Titleを持つサンプルオブジェクトを1つ定義し、すべてのPropertiesを "TEST"に設定しましたが、ロードされますが、JSONファイルはテーブルに入力されません。ファイルが正しくダウンロードされていることがわかりますが、要素がhappyHoursのプロパティ変数に追加されていないか、要素が再読み込みされていないと思われます。

私はここから多くのソリューションを試しましたが、成功しませんでした。私は間違って何をしていますか?

答えて

11

あなたのself.tableView.reloadData()行はコールバックの外です。つまり、データがロードされる前に直ちに呼び出されます。試してみてください:

func loadHappyHourElements(){ 

    let testhappyhour:HappyHour = HappyHour(title: "TEST", image: "TESST", description: "TEST", postedDate: "TEST") 
    self.happyHours.append(testhappyhour) 

    let url:String = "https://gist.githubusercontent.com/arianitp/036133ebb5af317a595c/raw/f134ec241ec3126bedd6debe5de371e3e01d225b/happyhours.json" 
    Alamofire.request(.GET, url, encoding:.JSON).responseJSON 
     { response in switch response.result { 
     case .Success(let JSON): 
      let response = JSON as! NSArray 
      for item in response { // loop through data items 
       let obj = item as! NSDictionary 
       let happyhour = HappyHour(title:obj["title"] as! String, image:obj["image"] as! String, description:obj["description"] as! String, postedDate:obj["date"] as! String) 
       self.happyHours.append(happyhour) 
      } 
      self.tableView.reloadData() 

     case .Failure(let error): 
      print("Request failed with error: \(error)") 
      } 
    } 
} 
+1

ライフセーバー!ありがとう、それは魅力のように働いた。 –

+1

@RinorBytyçi問題はない、簡単に間違いを作る! :) Btw、[Alamofire-SwiftyJSON](https://github.com/SwiftyJSON/Alamofire-SwiftyJSON)を使ってJSONレスポンスの処理を簡単にしてみてください。 – Tometoyou

関連する問題