如何在 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 中动态应用?的主要内容,如果未能解决你的问题,请参考以下文章