【问题标题】:SwiftyJSON Populate TableView - Empty CellsSwiftyJSON 填充 TableView - 空单元格
【发布时间】:2015-10-25 12:11:15
【问题描述】:

我设法在 Swift 中解析了一些 JSON,但我有点挣扎。我需要从“事件”属性中提取“标题”字符串。我有“Hasta”和“Location”,这对我(初学者)有好处。所以,现在我试图用这 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
}

【问题讨论】:

  • 那么,有什么想法吗? :)
  • 删除了大量的换行符以提高可读性
  • 谢谢...但是有人愿意帮忙吗?

标签: json swift parsing tableview


【解决方案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()   

【讨论】:

  • 优秀的哈鲁扎克!但是我现在收到一个错误...“'catch' 块无法访问,因为在 'do' 块中没有引发错误”。有什么帮助吗?
  • 现在你在 do/try/catch 块中没有任何try,所以 catch 永远不会被调用,因为你从不“尝试”任何东西。我没有注意到,对不起。您也可以删除 do/catch 块,请参阅编辑后的答案。
  • 非常感谢! :) 我可以更改顺序,让它们以另一个顺序打印吗?
  • 我现在有三个文本标签...'textLabel1" "textLabel1" & "textLabel3"。是否会打印每个字符串的信息..."Event"、"Hasta" & "Location"在每个?谢谢
  • 那么什么样的对象是 TableData?我猜一个简单的数组?最好将字典存储在该数组中,然后在cellForRow 中获取该字典并填充标签。
猜你喜欢
  • 2020-03-04
  • 2016-01-15
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-13
  • 2015-06-22
  • 2016-06-29
相关资源
最近更新 更多