Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何过滤UITableView | Swift JSON中显示的信息类型_Json_Swift_Uitableview - Fatal编程技术网

如何过滤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完全相同