如何将swiftyJSON dictionaryValue用作UILabel的可用字符串?

如何将swiftyJSON dictionaryValue用作UILabel的可用字符串?

问题描述:

我有一个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() } }' –

的问题是,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

啊我明白了!这就说得通了。谢谢一堆 –

解析的方法是下一个

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类 –