SWIFT 在表视图控制器上显示过滤的 JSON 数组

Posted

技术标签:

【中文标题】SWIFT 在表视图控制器上显示过滤的 JSON 数组【英文标题】:SWIFT Show filtered JSON Array on Table View Controller 【发布时间】:2020-04-02 05:50:58 【问题描述】:

我是一名初学者,目前正在从事这个自我实践项目。我正在尝试从 JSON 中获取数据并按国家/地区过滤数据(下面我仅过滤意大利数据)。然后我想将此过滤后的数组保存到 dataArray 并在表格视图中显示它,但它不起作用。请让我知道我错过了什么。谢谢!

import Foundation
import UIKit
import CoreLocation
import SwiftyJSON

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 


    @IBOutlet weak var label1: UILabel!

    struct Spot : Decodable 
        let Province: String
        let Country : String
        let Last_Update : String
        let Confirmed : String
        let Deaths : String
        let Recovered : String
        let Latitude : String?
        let Longitude : String?

        enum CodingKeys: String, CodingKey 
            case Province = "Province/State"
            case Country = "Country/Region"
            case Last_Update = "Last Update"
            case Confirmed
            case Deaths
            case Recovered
            case Latitude
            case Longitude
        
    

    @IBOutlet weak var TableView: UITableView!

    //Constants

    let covid_URL = "https://raw.githubusercontent.com/zmsp/coronavirus-json-api/master/latest.json"
    var dataArray : [[String : Any]] = []
    let cellReuseIdentifier = "cell"

    override func viewDidLoad() 
        super.viewDidLoad()

        self.TableView.register(UITableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)
        TableView.delegate = self
        TableView.dataSource = self

        getData()

        TableView.reloadData()
    

    @IBAction func getButtonPressed(_ sender: UIButton) 



    


    //MARK: - Networking

    //getData method:
    func getData () 

        let url = URL(string: covid_URL)!

        let task = URLSession.shared.dataTask(with: url) (data, response, error) in
            guard let data = data else  return 
            let decoder = JSONDecoder()

            do 
                let rates = try decoder.decode([Spot].self, from: data)
                let rate = rates.filter  $0.Country == "Italy"
                let dataArray = rate

                self.TableView.reloadData()
            

            catch 
                print("Error after loading",error)
            
        .resume()

    

    func numberOfSections(in tableView: UITableView) -> NSInteger 
        return 1
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: NSInteger) -> NSInteger 
        return dataArray.count
    

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

        var dict = dataArray[indexPath.row] as! [String : String]
        let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell")!
        let confirmed = dict["Confirmed"]
        cell.textLabel!.text = confirmed

        return cell
    


【问题讨论】:

API调用后你检查dataArray了吗?是空的还是有数据的? 是的,它有数据。调用后尝试打印json,调用成功 【参考方案1】:

请从您分配过滤器数据的 API 调用中的 dataArray 中删除 let 关键字。也就是说,

do 
    let rates = try decoder.decode([Spot].self, from: data)
    let rate = rates.filter  $0.Country == "Italy"
    dataArray = rate
    self.TableView.reloadData()
 catch 
    print("Error after loading",error)

设置 Spot 类类型的 dataArray 而不是字典数组。

像这样:-

var dataArray = [Spot]()

【讨论】:

我能够修复它。感谢您的帮助!【参考方案2】:
let rate = rates.filter  $0.Country == "Italy"
self.dataArray = rate // Instead of creating new object, assign to previously declared

self.TableView.reloadData()

另外,更新一下

var dataArray : [Spot] = []

【讨论】:

我修复成功了。感谢您的帮助!

以上是关于SWIFT 在表视图控制器上显示过滤的 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章

如何重新加载 UIPageViewController 以在 Swift 中重新加载其视图

swift 2.2中api(json)没有数据时如何显示警报

在表格视图控制器iOS swift中搜索特定记录

在视图控制器上不显示视图控制器 - Swift / Objective-C

调用//JSON 文件在 SWIFT 中损坏?缺少参数“委托”的参数?

在 ios swift 中导航到其他屏幕时,不鼓励在分离的视图控制器上显示视图控制器