1

makeRequest()在 UITableViewController 中有一个方法,代码如下:

    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 类,其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}" 如果是对任何人都有用。我在这里真的很困惑......有什么想法吗?

4

2 回答 2

4

问题是该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重新分配给其中包含字典的对象。因此无效。responseitemsJSONself.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 - 同样在您理解了上述内容并纠正了问题之后,您可能需要稍微重构代码以反映对数据模型的正确理解。

于 2015-04-19T23:11:40.680 回答
0

解析的方式是下一个

element: JSONValue //Something with JSONValue
if let title = element["name"]?.string {
    cell.title.text = title
}
于 2015-04-19T04:12:18.810 回答