SWIFT 在 Table 视图控制器上显示过滤的 JSON 数组
SWIFT Show filtered JSON Array on Table View Controller
我是初学者,目前正在从事这个自我练习的项目。我正在尝试从 JSON 获取数据并按国家/地区过滤数据(下面我只过滤意大利数据)。然后我想将这个过滤后的数组保存到 dataArray 并在 Table 视图上显示它,但它不起作用。请让我知道我错过了什么。谢谢!
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 { [=13=].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 中删除 let 关键字。也就是说,
do {
let rates = try decoder.decode([Spot].self, from: data)
let rate = rates.filter { [=10=].Country == "Italy"}
dataArray = rate
self.TableView.reloadData()
} catch {
print("Error after loading",error)
}
设置 Spot 类型的 dataArray class 而不是字典数组。
像这样:-
var dataArray = [Spot]()
let rate = rates.filter { [=10=].Country == "Italy"}
self.dataArray = rate // Instead of creating new object, assign to previously declared
self.TableView.reloadData()
另外,更新这个
var dataArray : [Spot] = []
我是初学者,目前正在从事这个自我练习的项目。我正在尝试从 JSON 获取数据并按国家/地区过滤数据(下面我只过滤意大利数据)。然后我想将这个过滤后的数组保存到 dataArray 并在 Table 视图上显示它,但它不起作用。请让我知道我错过了什么。谢谢!
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 { [=13=].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 中删除 let 关键字。也就是说,
do {
let rates = try decoder.decode([Spot].self, from: data)
let rate = rates.filter { [=10=].Country == "Italy"}
dataArray = rate
self.TableView.reloadData()
} catch {
print("Error after loading",error)
}
设置 Spot 类型的 dataArray class 而不是字典数组。
像这样:-
var dataArray = [Spot]()
let rate = rates.filter { [=10=].Country == "Italy"}
self.dataArray = rate // Instead of creating new object, assign to previously declared
self.TableView.reloadData()
另外,更新这个
var dataArray : [Spot] = []