如何将 swiftyJSON dictionaryValue 用作 UILabel 的可用字符串?
How can I use swiftyJSON dictionaryValue as a usable string for a UILabel?
我在 UITableViewController 中有一个 makeRequest()
方法,代码如下:
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)")
向控制台打印一个漂亮的响应,所以我知道它工作正常...
我还有一个自定义的 UITableViewCell class 和 bindData()
方法,代码如下:
func bindData() {
println("VenueDetailHeaderCell data did set")
self.venueDetailTitleLabel.text = self.headerInfo?["name"].stringValue
let labelData = self.headerInfo?["name"].stringValue
println("labelData is: \(labelData)")
}
如您所见,我正在尝试将 UILabel 的文本设置为 JSON 响应中的 ["name"].stringValue。但是,当我 println("labelData is: \(labelData)")
我得到 labelData 的控制台输出是: Optional("") 这显然是空的。
这是我要抓取的内容的屏幕截图
我在这里做错了什么,我如何获取场地名称并将我的 UILabel 分配给它?
更新:
我尝试了以下代码
let labelData = self.headerInfo?["name"].error
println("labelData is: \(labelData)")
并获得控制台输出:"Error Domain=SwiftyJSONErrorDomain Code=901 "Array[0] failure, It is not an array" UserInfo=0x7fd6d9f7dc10 {NSLocalizedDescription=Array[0] failure, It is not an array}" 如果对任何人都有用。我在这里真的很困惑...有什么想法吗?
接下来的解析方式
element: JSONValue //Something with JSONValue
if let title = element["name"]?.string {
cell.title.text = title
}
问题是 headerInfo
值是一个错误 JSON
对象,因为您正在尝试访问具有整数索引的字典。
请注意,var responseitems:JSON = []
不会创建数组对象。 SwiftyJSON 具有自动赋值构造函数(我是 swift 的新手,所以不确定正确的 swift 术语是什么)...请参阅此初始化程序SwiftyJSON.swift 源代码:
extension JSON: ArrayLiteralConvertible {
public init(arrayLiteral elements: AnyObject...) {
self.init(elements)
}
}
这意味着当您执行 var responseitems:JSON = []
时,您并不是在创建数组,而是在创建一个 JSON
对象,该对象是使用上述 init
的空数组构造的方法。然后,当您执行 self.responseitems = jObj
时,您会将 responseitems
变量重新分配给一个 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
请注意,以上所有内容均假设 Swift 1.2 且 SwiftyJSON >= 2.2 - 在您理解上述内容并更正问题后,您可能会想要稍微重构代码以反映对数据模型的正确理解。
我在 UITableViewController 中有一个 makeRequest()
方法,代码如下:
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)")
向控制台打印一个漂亮的响应,所以我知道它工作正常...
我还有一个自定义的 UITableViewCell class 和 bindData()
方法,代码如下:
func bindData() {
println("VenueDetailHeaderCell data did set")
self.venueDetailTitleLabel.text = self.headerInfo?["name"].stringValue
let labelData = self.headerInfo?["name"].stringValue
println("labelData is: \(labelData)")
}
如您所见,我正在尝试将 UILabel 的文本设置为 JSON 响应中的 ["name"].stringValue。但是,当我 println("labelData is: \(labelData)")
我得到 labelData 的控制台输出是: Optional("") 这显然是空的。
这是我要抓取的内容的屏幕截图
我在这里做错了什么,我如何获取场地名称并将我的 UILabel 分配给它?
更新:
我尝试了以下代码
let labelData = self.headerInfo?["name"].error
println("labelData is: \(labelData)")
并获得控制台输出:"Error Domain=SwiftyJSONErrorDomain Code=901 "Array[0] failure, It is not an array" UserInfo=0x7fd6d9f7dc10 {NSLocalizedDescription=Array[0] failure, It is not an array}" 如果对任何人都有用。我在这里真的很困惑...有什么想法吗?
接下来的解析方式
element: JSONValue //Something with JSONValue
if let title = element["name"]?.string {
cell.title.text = title
}
问题是 headerInfo
值是一个错误 JSON
对象,因为您正在尝试访问具有整数索引的字典。
请注意,var responseitems:JSON = []
不会创建数组对象。 SwiftyJSON 具有自动赋值构造函数(我是 swift 的新手,所以不确定正确的 swift 术语是什么)...请参阅此初始化程序SwiftyJSON.swift 源代码:
extension JSON: ArrayLiteralConvertible {
public init(arrayLiteral elements: AnyObject...) {
self.init(elements)
}
}
这意味着当您执行 var responseitems:JSON = []
时,您并不是在创建数组,而是在创建一个 JSON
对象,该对象是使用上述 init
的空数组构造的方法。然后,当您执行 self.responseitems = jObj
时,您会将 responseitems
变量重新分配给一个 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
请注意,以上所有内容均假设 Swift 1.2 且 SwiftyJSON >= 2.2 - 在您理解上述内容并更正问题后,您可能会想要稍微重构代码以反映对数据模型的正确理解。