SwiftyJSON填充TableView - 空单元格

时间:2015-10-25 12:11:16

标签: json swift parsing tableview

我设法在Swift中解析一些JSON,而且我有点挣扎。我需要从“Event”属性中提取“title”字符串。我有“Hasta”& “位置”,这对我(初学者)有好处。所以,现在我正在尝试使用这3个属性填充tableview。到目前为止,tableview是空的,并不显示我的信息。有帮助吗?请记住我是一个相对初学者 - 如此谨慎的解释将是受欢迎的。我一直在使用SwiftyJSON来解析JSON。我给了我的代码解释标记。作为参考,我有一个变量= var TableData = String。

    let url = NSURL(string:"https://www.kimonolabs.com/api/7flcy3qm?apikey=gNq3hB1j0NtBdAvXJLEFx8JaqtDG8y6Y")!
    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithURL(url) { (data, response, error) -> Void in

        if error != nil {
            print(error)
        } else {
            if let _ = data {
                do {
                    let jsonString = try NSString.init(contentsOfURL: url, encoding: NSUTF8StringEncoding)

                    // Create JSON object from data
                    let json = JSON(data: jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!)

                    // Check if array for key "collection2" exists
                    if let collection2 = json["results"]["collection2"].array {
                        // Create JSON array from it and loop for each object

                        for (_, subJson):(String, JSON) in JSON(collection2) {
                            // Check if dictionary for key "Event" exists
                            if let event = subJson["Event"].dictionary {
                                print(event)
                            }

                            // Check if string for key "Hasta" exists
                            if let hasta = subJson["Hasta"].string {
                                self.TableData.append(hasta)
                                //print(hasta)
                            }

                            // Check if string for key "Location" exists
                            if let location = subJson["Location"].string {
                                self.TableData.append(location)
                                //print(location)
                            }
                        }
                    }
                } catch {
                    print("In catch block")
                }
            }
        }
    }

    task.resume()
}   

以下是我正在尝试填充表格(如下)。我意识到我需要制作一个带有3个标签的自定义单元格。但是现在,是否可以只使用3中的任何一个来填充tableview,只是为了看它是否有用。

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return self.TableData.count
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
    cell.textLabel?.text = self.TableData[indexPath.row]
    return cell
}

1 个答案:

答案 0 :(得分:1)

你在这里做了一些不必要的事情。首先,您设置了一个从URL下载数据的任务。在完成块中,请求完成后,您将创建一个带有contentsOfURL的字符串,该字符串再次调用相同的请求并将响应转换为字符串。然后从字符串创建NSData并将其传递给JSON()以解析JSON字符串。但是您已经在完成块中获得了数据:

session.dataTaskWithURL(url) { (data, response, error) -> Void in

所以你可以转过身来:

let jsonString = try NSString.init(contentsOfURL: url, encoding: NSUTF8StringEncoding)
let json = JSON(data: jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!)

进入这个:

let json = JSON(data: data)

但这还没有回答你的问题。当您将数据存储到TableData时,您必须刷新TableView。所以在完成块结束时尝试调用

self.tableview.reloadData()

这应该是如何工作的(未经测试):

let url = NSURL(string:"https://www.kimonolabs.com/api/7flcy3qm?apikey=gNq3hB1j0NtBdAvXJLEFx8JaqtDG8y6Y")!
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(url) { (data, response, error) -> Void in

    if error != nil {
        print(error)
    } else {
        if data != nil {
            // Create JSON object from data
            let json = JSON(data: data)

            // Check if array for key "collection2" exists
            if let collection2 = json["results"]["collection2"].array {
                // Create JSON array from it and loop for each object
                for (_, subJson):(String, JSON) in JSON(collection2) {
                    var data: [String : Any] = [String : Any]()

                    // Check if dictionary for key "Event" exists
                    if let event = subJson["Event"].dictionary {
                        data["event"] = event
                    }
                    // Check if string for key "Hasta" exists
                    if let hasta = subJson["Hasta"].string {
                        data["hasta"] = hasta
                    }
                    // Check if string for key "Location" exists
                    if let location = subJson["Location"].string {
                        data["location"] = location
                    }

                    self.TableData.append(data)
                }

                self.tableView.reloadData()
            }
        }
    }
}

task.resume()