将 Json 解析为 UITableview

Posted

技术标签:

【中文标题】将 Json 解析为 UITableview【英文标题】:Parsing Json to UITableview 【发布时间】:2018-02-24 00:17:35 【问题描述】:

我有一个 UITableView,我需要使用我上网的一些 JSON 数据填充单元格。我已经成功获取并解析了数据。问题在于未使用正确数据创建单元格,因为它们是在 JSON 完成加载之前创建的,因此无法与数据一起显示。我知道您可以轻松使用tableView.reloadData(),但我遇到了另一个问题。我需要在调用任何 tableView 方法之前下载数据。

这样做的原因是因为我想根据 JSON 中有多少单元格来返回单元格的数量。所以像jsoncells.count

到目前为止,这是我的代码:我有一些版本还可以,但是因为我一直在修改代码,所以它们已经消失了。

import UIKit

class TimelineViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 

@IBOutlet weak var backgroundImageView: UIImageView!
var timelineCellDataArray = [[String:String]]()
override func viewDidLoad() 
    super.viewDidLoad()
    setupBackground(backgroundImage: #imageLiteral(resourceName: "Placeholder 1.jpeg"))


func setupBackground(backgroundImage: UIImage) 
    backgroundImageView.image = backgroundImage

    // Background Image Blur Effect:
    let backgroundImageBlurEffect = UIBlurEffect(style: .light)
    let backgroundImageBlurEffectView = UIVisualEffectView(effect: backgroundImageBlurEffect)
    backgroundImageBlurEffectView.frame = backgroundImageView.frame
    backgroundImageView.addSubview(backgroundImageBlurEffectView)


// Change View Controller To Profle View Controller
func setViewToProfileViewController() 
    print("H")
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewController(withIdentifier: "ProfileViewController") as! ProfileViewController
    self.navigationController?.pushViewController(vc, animated: true)




func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return 4


var isLoad = true
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    var cell = tableView.dequeueReusableCell(withIdentifier: "TimelineCell", for: indexPath) as! TimelineCell

    // Json Parsing For Cell Populating
    let urlString = "https://www.jasonbase.com/things/QRkQ.json"
    let url = URL(string: urlString)
        URLSession.shared.dataTask(with: url!)  (data, response, error) in
            if error != nil  

             else 
                do 
                    let parsedData = try JSONSerialization.jsonObject(with: data!) as! [String:[[String:String]]]
                    self.timelineCellDataArray = parsedData["timelineCell"]!
                    DispatchQueue.main.async 
                        print("we")
                        switch self.timelineCellDataArray[indexPath.row]["cellType"] 
                        case "1"?:
                            cell = cell.createPostCell(cellToUse: cell)
                        case "2"?:
                            cell = cell.createPartyCell(cellToUse: cell)
                        case"3"?:
                            cell = cell.createFriendRequestCell(cellToUse: cell)
                        default:
                            break
                        
                        tableView.reloadData()
                        self.isLoad = false
                    
                 catch let error as NSError 
                    print(error)
                
            
            .resume()
    print("WD")
    return cell



这是我的 JSON https://www.jasonbase.com/things/QRkQ.json

【问题讨论】:

为什么要在 cellForRowAt 委托方法中重新加载 tableview?不要在 cellForRowAt 委托方法中创建数据集。使用前先用英语词典查一下动词“to accuse”。 好吧,就像我说的那样,我只是在修补看看它是否有效,但我这样做是为了让表格视图加载数据,并在加载数据后重新加载包含数据的单元格跨度> cellForRowAt 加载数据是个糟糕的主意。您需要从 viewDidLoad 或其他仅加载一次数据而不是每个单元格的适当位置加载数据。 好的,但是我如何在创建单元格之前加载该数据,因为记住单元格数据和我要创建的单元格数量将来自数据库 只是一个快速提示,您的createPostCell 不应该一次做所有这些事情:成为一个单元格的非静态函数,将一个单元格作为参数,并返回一个新单元格.让createPostCell 成为一个非静态函数是更好的编码实践,它接收用于填充该单元格实例的数据。 【参考方案1】:

viewDidLoad 中进行 JSON 采集。然后,您可以创建一个全局变量(您似乎正在使用名为 timelineCellDataArray 的变量),该变量存储您每次从数据库中获取新数据时附加的数据。

从数据库中获取所有数据后,请致电tableView.reloadData()。这样,在您的 numberOfRowsInSection 函数中,您只需返回 timelineCellDataArray.count。在您的 cellForRowAt 函数中,您只需获取 timelineCellDataArray[index.row] 中的对象并使用此数据填充您的单元格。

【讨论】:

非常感谢,这很有帮助。所以基本上我在 viewdid 加载中获取数据并且数据完成后我重新加载将再次调用所有 tableView 函数的视图? 唯一的问题是我不能从外部函数执行 tableView.reloadData() 为您的 tableView 创建一个出口,然后您可以在 viewDidLoad 中引用它

以上是关于将 Json 解析为 UITableview的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 对象解析为 Django 模板

将 JSON 解析为列表 [重复]

JSON.NET 将 +00:00 时区解析为当地时间,但 Z 解析为 UTC

使用gson解析怎么将json字符串解析为数组

将 JSON 数组解析为对象集合

使用 JSON.net 将 JSON 解析为匿名对象 []