如何过滤UITableView | Swift JSON中显示的信息类型
我有一个如何过滤UITableView | Swift JSON中显示的信息类型,json,swift,uitableview,Json,Swift,Uitableview,我有一个UITableView从JSON获取信息问题是我只想在UITableView中显示String值,不包括任何double JSON解码器的结构是: struct PurchaseTotals: Codable { var sumTotal: Double? var animal: String? var name: String? enum CodingKeys: String, CodingKey { case sumTotal = "s
UITableView
从JSON获取信息问题是我只想在UITableView
中显示String
值,不包括任何double
JSON解码器的结构是:
struct PurchaseTotals: Codable {
var sumTotal: Double?
var animal: String?
var name: String?
enum CodingKeys: String, CodingKey {
case sumTotal = "sumTotal"
case animal = "animal"
case sumTotal = "name"
}
lazy var formattedSumTotal: String? = {
if let sumTotal = sumTotal {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
let str = formatter.string(from: NSNumber(value: sumTotal))
return str
}
return nil
}()
}
在cellForRowAt
中,我用变量portfolio
定义结构:
var portfolio: PurchaseTotals
在cellForRowAt
中,正在填充单元格,并以以下方式显示在UITableView中
首先,我用变量structure
定义JSON结构:
var structure = [PurchaseTotals]()
然后我将变量portfolio
设置为structure[indexPath.row]
portfolio = structure[indexPath.row]
JSON如下所示:
[{"name":"Jake","animal":"dog"},{"name":"Mary","animal":"cat"},{"sumTotal":100}]
这意味着现在的单元格数量是3,但我想要2个单元格,不包括总数
更新:
import UIKit
class TableViewController: UITableViewController {
var dataSource = [PurchaseTotals]()
var structure = [PurchaseTotals]() {
didSet {
dataSource = structure.filter({ $0.sumTotal == nil })
self.tableView.reloadData()
}
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dataSource.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cellID", for: indexPath) as! ScheduleCell
var portfolio = dataSource[indexPath.row]
return cell
}
struct PurchaseTotals: Codable {
var sumTotal: Double?
var animal: String?
var name: String?
lazy var formattedSumTotal: String? = {
if let sumTotal = sumTotal {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
let str = "$" + formatter.string(from: NSNumber(value: sumTotal))!
return str
}
return nil
}()
}
创建一个名为
dataSource
的单独变量,该变量将仅包含结构中具有sumTotal=nil
的那些元素,即
var structure = [PurchaseTotals]() {
didSet {
dataSource = structure.filter({ $0.sumTotal == nil })
self.tableView.reloadData()
}
}
var dataSource = [PurchaseTotals]()
在上面的代码中,当获得API响应后填充结构数组时,数据源数组将在structure
的didSet
中更新
因此,structure
将包含来自API响应的实际数据。而数据源
将包含从结构
中过滤的内容
现在,在UITableViewDataSource
方法中使用dataSource
array
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dataSource.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let portfolio = dataSource[indexPath.row]
//rest of the code...
}
注意:如果属性名称与API键完全匹配,则不需要使用enum CodingKeys
。因此,struct PurchaseTotals
可以重写为
struct PurchaseTotals: Codable {
var sumTotal: Double?
var animal: String?
var name: String?
lazy var formattedSumTotal: String? = {
//rest of the code...
}()
}
编辑-1:
import UIKit
class TableViewController: UITableViewController {
var dataSource = [PurchaseTotals]()
var structure = [PurchaseTotals]() {
didSet {
dataSource = structure.filter({ $0.sumTotal == nil })
self.tableView.reloadData()
}
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dataSource.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cellID", for: indexPath) as! ScheduleCell
var portfolio = dataSource[indexPath.row]
return cell
}
struct PurchaseTotals: Codable {
var sumTotal: Double?
var animal: String?
var name: String?
lazy var formattedSumTotal: String? = {
if let sumTotal = sumTotal {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
let str = "$" + formatter.string(from: NSNumber(value: sumTotal))!
return str
}
return nil
}()
}
使用示例JSON而不是API响应,如
let str = """
[{"name":"Jake","animal":"dog"},{"name":"Mary","animal":"cat"},{"sumTotal":100}]
"""
if let data = str.data(using: .utf8) {
do {
structure = try JSONDecoder().decode([PurchaseTotals].self, from: data)
print(structure)
} catch {
print(error)
}
}
这是整个代码,对我来说很好
struct PurchaseTotals:Codable{
总数:两倍?
动物:绳子?
变量名称:字符串?
lazy var formattedsumTotal:字符串?={
如果让sumTotal=sumTotal{
let formatter=NumberFormatter()
formatter.numberStyle=.decimal
让str=formatter.string(from:NSNumber(值:sumtottal))
返回str
}
归零
}()
}
类TableViewController:UITableViewController{
var结构=[PurchaseTotals](){
迪塞特{
dataSource=structure.filter({$0.sumTotal==nil})
self.tableView.reloadData()
}
}
var数据源=[PurchaseTotals]()
重写func viewDidLoad(){
super.viewDidLoad()
让str=”“”
[{“名字”:“杰克”,“动物”:“狗”},{“名字”:“玛丽”,“动物”:“猫”},{“sumTotal”:100}]
"""
如果let data=str.data(使用:.utf8){
做{
structure=try JSONDecoder().decode([PurchaseTotals].self,from:data)
}抓住{
打印(错误)
}
}
}
重写func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int{
返回dataSource.count
}
重写func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{
let cell=tableView.dequeueReusableCell(带有标识符:“cell”,用于:indexath)
cell.textlab?.text=dataSource[indexath.row].name
返回单元
}
}
是否要在任何地方使用sumTotal?是的,sumTotal正在UILabel中使用,但不应包含在UITableView中添加答案。检查一下。同样的问题仍然存在,所有三行仍然显示出来。您是否使用了相同的代码?在问题中添加UITableViewDataSource方法。对于延迟,我深表歉意,请查看我的更新,我使用的是UITableViewController而不是UIViewController。我已经包含了我的大部分代码,所以可以看一看。json响应与问题中的完全相同吗?是的,json完全相同