如何在 swift 2.0 中提取 JSON 数据以在 UITableView 中动态应用?

Posted

技术标签:

【中文标题】如何在 swift 2.0 中提取 JSON 数据以在 UITableView 中动态应用?【英文标题】:How to extract JSON Data to apply Dynamically in UITableView in swift 2.0? 【发布时间】:2016-07-26 10:10:22 【问题描述】:

我对从 JSON 解析数据感到困惑。实际上,我提取了整个数据。但我很困惑如何将它应用于表视图行。那么,如何提取 JSON 数据并将其应用于动态 tableView 行?非常感谢。

来自 URL 的 JSON 数据如下所示,


  "main_result": "1",
  "event_listing": [
    
      "event_details": "Omega Events",
      "pdf_url": "http://portal.shineevents.co.in/portal/assets/uploads/pdf/",
      "modified_date": "2016-06-22 14:17:02"
    ,
    
      "event_details": "Cobra Events",
      "pdf_url": "http://portal.shineevents.co.in/portal/assets/uploads/pdf/",
      "modified_date": "2016-06-22 14:17:18"
    ,
    
      "event_details": "Kovai Events",
      "pdf_url": "http://portal.shineevents.co.in/portal/assets/uploads/pdf/",
      "modified_date": "2016-06-22 14:23:45"
    
  ]

我尝试过的代码

import UIKit

class ViewController: UIViewController, UITableViewDataSource,UITableViewDelegate

    var labels = ["Taylor Swift","Eminem","Avlirl","Michael"] /* i use dummy array now*/

    @IBOutlet var tableView: UITableView!


    override func viewDidLoad() 
        super.viewDidLoad()
        retrieveDataFromJASON()
    

    func retrieveDataFromJASON()
    
        let URL = NSURL(string: "http://portal.shineevents.co.in/portal/api_load/app_load_call")
        let requestURL = NSMutableURLRequest(URL: URL!)
        requestURL.HTTPMethod = "POST"

        let postString = "api=event_list"

        requestURL.addValue("123456", forHTTPHeaderField: "X-API-KEY")
        requestURL.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)

        let task = NSURLSession.sharedSession().dataTaskWithRequest(requestURL)  data, response, error in

            guard error == nil && data != nil else 
                print("error=\(error)")

                return

            

            if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 

                print("statusCode should be 200, but is \(httpStatus.statusCode)")

                print("response = \(response)")


            

            let responseString2 = try! NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments)

            print(responseString2) /*prints whole JSON Data*/


            let events = responseString2["event_listing"] as? [[String: AnyObject]]

            for eventName in events!
            
                print(eventName["event_details"])

                /* Prints:
                    Optional(Omega Events)
                    Optional(Cobra Events)
                    Optional(Kovai Events)  // How to print only First event only
                */

            
        

        task.resume()
    

    func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return labels.count  // How to use event_details.count
    

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = self.tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! TableCell
        cell.titles.text = labels[indexPath.row]  // how to use event_details[indexPath.row]
        return cell
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        

【问题讨论】:

【参考方案1】:

您需要声明[[String: AnyObject]] 类型的实例变量并将其与UITableViewDelegate 方法一起使用,如下所示

var events : [[String: AnyObject]] = [[String: AnyObject]]()

现在在收到响应后初始化此事件对象,然后重新加载 tableView

self.events = responseString2["event_listing"] as? [[String: AnyObject]]
self.tableView.reloadData()

现在将此events 对象与UITableView 方法一起使用

func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    return 1


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return events.count  // How to use event_details.count


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell = self.tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! TableCell
    cell.titles.text = events[indexPath.row]["event_details"] as? String 
    return cell
    

【讨论】:

哇!伟大的 Nirav 先生。感谢您的明确解释。谢谢很多:) :) 欢迎小伙伴快乐编码:) 嗨,Nirav 先生,我需要更多帮助。以及我在我的代码上更新您的答案。当我单击按钮时,tableView 打开。但是表格视图没有显示任何数据。之后,我按下表视图中的任意位置,然后表视图显示检索到的 JSON 数据的行数。我该如何解决? 请更新新代码,以便我了解您面临的问题。 更新此问题或添加新帖子并在此处给我新帖子的链接【参考方案2】:

您可以通过将其转换为 NSData 来获取 JSON 数据。请检查我的答案:How to save JSON data from a POST Request into dictionary with Swifty Json?

一旦你有了字典,你就可以轻松解析它。看到这个:http://tech.ustwo.com/2014/08/01/ios-swift-dictionaries/

您还应该在 tableview 上创建自己的单元格,以便将属性添加到单元格中。按照本教程进行操作:https://www.raywenderlich.com/129059/self-sizing-table-view-cells

希望对您有所帮助。

【讨论】:

你好。发布链接并不是一个好的答案。您可以使用代码和解释发布问题的实际答案,或者如果您认为问题已经有答案,则可以将问题标记为“重复”。谢谢。 其实这个答案似乎不错。但我无法理解。因为,我不知道 Objective-C 并且我不知道如何使用你的方法来解决我的问题。无论如何感谢Firats先生的回复:) :) :D :D 哦,好吧好吧!再次感谢您的意见。重复均值?已经在stack over flow上问过了啊?或者这个问题有答案了,不用回答啊? @MohanSingh Duplicate 的意思是“这个问题已经有了答案”。这是因为 SO 不希望有重复的内容,因此用户可以在看到问题后立即将问题标记为重复,而不是一次又一次地回答相同的问题。 哦,好的。因为我只知道几个英文单词!我会努力改进我的答案。

以上是关于如何在 swift 2.0 中提取 JSON 数据以在 UITableView 中动态应用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 2.0 中使用 catch 概念

如何使用 swift 2.0 制作 http post json 请求参数

核心数据和数组 swift 2.0

JSON:使用 Alamofire 和 Swift 3 提取数据

如何在 Swift 中从 alamofire 中提取数据? [复制]

使用 Swift 2.0 解析并跳转到 JSON 文件中的下一个块