为啥我用这些代码得到一个空的 Tableview? JSON

Posted

技术标签:

【中文标题】为啥我用这些代码得到一个空的 Tableview? JSON【英文标题】:Why do i get a empty Tableview with these code? JSON为什么我用这些代码得到一个空的 Tableview? JSON 【发布时间】:2016-10-14 18:22:50 【问题描述】:

我在将数据加载到我的 tableview 时遇到了一些问题。数据似乎没有正确加载。我刚刚开始ios编程,并且已经在这个问题上停留了一段时间。

Here is a screenshot of my storyboard

override func viewDidLoad() 
    super.viewDidLoad()


var afspraken = [Afspraak]()

func loadJsonData()

    let url = URL(string: "https://i342444.venus.fhict.nl/")
    let dataTask = URLSession.shared.dataTask(with: url!)
    
        (data, response, error)
        in
        if error != nil
        
            print (error)
        
        else
        
            do
            
                let jsonObject = try JSONSerialization.jsonObject(with: data!, options: .allowFragments)
                self.parseJsonData(jsonObject as! Array<AnyObject>)
                print(data)
            
            catch let error as NSError print("Error parsing JSON: \(error)" )
        
    

    dataTask.resume()


func parseJsonData(_ jsonObject: Array<AnyObject>) 
    for item in jsonObject
    
        let afspraak =
            Afspraak(naam: item["naam"] as! String
                ,   adres: item["adres"] as! String
                ,   postcode: item["postcode"] as! String
                ,   woonplaats: item["woonplaats"] as! String
                ,   telefoonnummer: item["telefoonnummer"] as! String
                ,   email: item["email"] as! String
                ,   datum: item["datum"] as! Date
                ,   tijdstip: item["tijdstip"] as! String
                ,   omschrijving: item["omschrijving"] as! String)


        afspraken.append(afspraak)
    
    self.tableView.reloadData()


override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return afspraken.count 


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

    let Cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    let currentRow = indexPath.row
    let currentAfspraak = self.afspraken[currentRow]
    Cell.textLabel?.text = currentAfspraak.naam
    return Cell

【问题讨论】:

【参考方案1】:

一个 URLDataTask 请求正在后台线程(非 UI 线程)中运行。因此,您需要在完成后使用 GCD-Grand Central Dispatch 更新主线程上的 UI。

DispatchQueue.main.sync 
    self.tableView.reloadData()

编辑

我查看了您的 JSON URL,它不是 JSON 文件,而是 html 文件。这就是JSONSerialization 返回无效的原因。您需要将 .json 文件放到您的服务器上,而不是将 json 字符串嵌入到 HTML 文件中。

你服务器上的文件是这样的:

如您所见,这是一个 HTML。

正确的 JSON 文件应该是这样的:

请注意图片上方两个网址的区别,正确的是.json,而你的只是/,是一个目录。

因此,您需要做的就是将您的 JSON 文件上传到您的服务器,并使用相应的 URL,例如 https://i342444.venus.fhict.nl/coolName.json

【讨论】:

没错,这是我仍然需要添加的内容。但问题似乎在于加载 JSON 数据。我的数组在运行代码时仍然是空的,所以我怀疑那里出了点问题。 @DennisvdEijnde 请查看我编辑的答案,您的网址有问题。

以上是关于为啥我用这些代码得到一个空的 Tableview? JSON的主要内容,如果未能解决你的问题,请参考以下文章

为啥我用loadrunner录制后脚本都是空的

为啥 UITableView 是空的?

为啥 Xcode 不执行 func tableView 中的代码?

Swift 3. 使用 Core Data 隐藏一个空的 tableView

为啥这些 DOS 变量是空的? (例如 %DATE%、%ERRORLEVEL%)

如果我的数组中有数据,空的 tableview 标签会闪烁一秒钟