如何将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。然而,当我我得到的标签数据的控制台输出是:可选(“”)这显然是空的。
这里是我想要抓住
我在做什么错在这里的截图,我怎么能抢场地的名字和我的UILabel分配给它?
UPDATE:
我尝试以下代码
let labelData = self.headerInfo?["name"].error
println("labelData is: \(labelData)")
而得到的控制台输出:“错误域= SwiftyJSONErrorDomain代码= 901 “数组[0]的故障,这是不是数组” UserInfo = 0x7fd6d9f7dc10 {NSLocalizedDescription = Array [0]失败,它不是数组}}“如果这对任何人都有用。我真的很困惑......任何想法?
的问题是,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 - 在理解了上述内容并纠正了问题之后,您也许会想重构一下代码以反映对数据模型的正确理解。
这有效!谢谢。但是,我得到'var headerInfo:JSON?'没有错误。这是否意味着它实际上可能是可选的?我把这个?作为一个检查,以防止它崩溃,如果它返回零。另外,就重构代码以反映对数据模型的正确理解而言,您会推荐什么?再次感谢 –
这不是一个错误或问题,使'headerInfo:JSON'但是我的观点是,尽管它是可选的,你将永远* *得到一个零值,总是一个有效的JSON对象。然而,你仍然可以检查'headerInfo == nil'但是请注意这不是在做你认为它正在做的事情。它创建一个有效的JSON对象,并在右侧用nil(内部存储为NSNull)进行初始化,然后将其与左侧的'headerInfo'进行比较。设置一个断点并进入代码,看看会发生什么。回覆。重构 - 不用担心,那只是我挑剔。 – jhabbott
啊我明白了!这就说得通了。谢谢一堆 –
解析的方法是下一个
element: JSONValue //Something with JSONValue
if let title = element["name"]?.string {
cell.title.text = title
}
对不起,我应该指定'var responseitems:JSON = []'所以我已经在做你没有运气的建议。 –
我也做'var headerInfo:JSON?在VenueDetailHeaderCell中,这是一个UITableView类 –
你是哪里设置的自定义''UITableViewCell'的self.headerInfo'价值?我假设你想要设置为“场地”JSON对象。但是,您似乎没有在您提供的任何示例代码中执行此操作。 – cnoon
@cnoon我做'var headerInfo:JSON? { didSet {self.bindData() } }' –