2015-04-19 71 views
1

我有一個UITableViewController內makeRequest()方法用下面的代碼:如何將swiftyJSON dictionaryValue用作UILabel的可用字符串?

func makeRequest() { 

    Alamofire.request(.GET, self.foursquareEndpointURL, parameters: [ 
     //"VENUE_ID" : self.foursquareVenueID, 
      "client_id" : self.foursquareClientID, 
      "client_secret" : self.foursquareClientSecret, 
      "v" : "20140806" 
      ]) 
     .responseJSON(options: nil) { (_, _, data, error) -> Void in 
     if error != nil { 
      println(error?.localizedDescription) 
     } else if let data: AnyObject = data { 
      let jObj = JSON(data) 
      if let venue = jObj["response"]["venue"].dictionaryValue as [String: JSON]? { 
       self.responseitems = jObj 
       println("venue is: \(venue)") 
      } 
      dispatch_async(dispatch_get_main_queue()) { 
       self.tableView.reloadData() // Update UI 
      } 
     } 
    } 
} 

也請記住,我有一個屬性var responseitems:JSON = []

println("venue is: \(venue)")打印一個好看的響應安慰,所以我知道這是正常工作......

我也有一個bindData()方法用下面的代碼自定義的UITableViewCell類:

func bindData() { 
    println("VenueDetailHeaderCell data did set") 
    self.venueDetailTitleLabel.text = self.headerInfo?["name"].stringValue 
    let labelData = self.headerInfo?["name"].stringValue 
    println("labelData is: \(labelData)") 
} 

正如你所看到的,我試圖在JSON響應中將UILabel的文本設置爲[「name」]。stringValue。然而,當我我得到的標籤數據的控制檯輸出是:可選(「」)這顯然是空的。

這裏是我想要抓住

enter image description here

我在做什麼錯在這裏的截圖,我怎麼能搶場地的名字和我的UILabel分配給它?

UPDATE:

我嘗試以下代碼

let labelData = self.headerInfo?["name"].error 
    println("labelData is: \(labelData)") 

而得到的控制檯輸出:「錯誤域= SwiftyJSONErrorDomain代碼= 901 「數組[0]的故障,這是不是數組」 UserInfo = 0x7fd6d9f7dc10 {NSLocalizedDescription = Array [0]失敗,它不是數組}}「如果這對任何人都有用。我真的很困惑......任何想法?

+0

你是哪裏設置的自定義''UITableViewCell'的self.headerInfo'價值?我假設你想要設置爲「場地」JSON對象。但是,您似乎沒有在您提供的任何示例代碼中執行此操作。 – cnoon

+0

@cnoon我做'var headerInfo:JSON? { didSet {self.bindData() } }' –

回答

4

的問題是,headerInfo值是錯誤JSON對象,因爲你試圖訪問一個字典與一個整數值。請注意0​​不會創建數組對象。 SwiftyJSON了自動分配,構造函數(我是新來的迅速,所以不知道正確的迅速術語是什麼)......看到這個初始化器在SwiftyJSON.swift源代碼:

extension JSON: ArrayLiteralConvertible { 
    public init(arrayLiteral elements: AnyObject...) { 
     self.init(elements) 
    } 
} 

這意味着當你做var responseitems:JSON = []你沒有創建一個數組時,你正在創建一個JSON對象,它使用上面的init方法用一個空的數組構建。然後,當您執行self.responseitems = jObj時,您將重新將該變量​​變量分配給JSON對象,並在其中包含字典。因此self.responseitems[0]無效。

另請注意,使用SwiftyJSON時,沒有可選的JSON對象。我注意到,在你的評論中你說你是var headerInfo:JSON? ... - 不可能有一個可選的JSON

var headerInfo: JSON = nil 

以上是可能的 - 這使用另一種自動初始化劑的是初始化一個有效JSON對象,表示JSON空值。

那麼,如何解決它?

當分配headerInfo做這樣的:

let headerInfo = self.responseitems["response"]["venue"] 

現在在bindData你可以這樣做:

self.venueDetailTitleLabel.text = self.headerInfo["name"].stringValue 

注意,上述所有假設雨燕1.2和SwiftyJSON> = 2.2 - 在理解了上述內容並糾正了問題之後,您也許會想重構一下代碼以反映對數據模型的正確理解。

+0

這有效!謝謝。但是,我得到'var headerInfo:JSON?'沒有錯誤。這是否意味着它實際上可能是可選的?我把這個?作爲一個檢查,以防止它崩潰,如果它返回零。另外,就重構代碼以反映對數據模型的正確理解而言,您會推薦什麼?再次感謝 –

+0

這不是一個錯誤或問題,使'headerInfo:JSON'但是我的觀點是,儘管它是可選的,你將永遠* *得到一個零值,總是一個有效的JSON對象。然而,你仍然可以檢查'headerInfo == nil'但是請注意這不是在做你認爲它正在做的事情。它創建一個有效的JSON對象,並在右側用nil(內部存儲爲NSNull)進行初始化,然後將其與左側的'headerInfo'進行比較。設置一個斷點並進入代碼,看看會發生什麼。回覆。重構 - 不用擔心,那只是我挑剔。 – jhabbott

+0

啊我明白了!這就說得通了。謝謝一堆 –

0

解析的方法是下一個

element: JSONValue //Something with JSONValue 
if let title = element["name"]?.string { 
    cell.title.text = title 
} 
+0

對不起,我應該指定'var responseitems:JSON = []'所以我已經在做你沒有運氣的建議。 –

+0

我也做'var headerInfo:JSON?在VenueDetailHeaderCell中,這是一個UITableView類 –