You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据JSON特定ID控制UITableView行数:符合条件才填充,否则返回0

解决UITableView根据JSON字段值动态设置行数的问题

嘿,没问题!这个需求其实很好实现,核心就是在UITableView的数据源方法里根据指定字段值过滤数据,然后动态返回符合条件的行数。我来给你具体的实现方案:

首先,假设你已经完成了JSON数据的解析,并且把数据存储在了一个数组里(比如模型数组或者字典数组)。下面分两种情况给出代码示例:

情况1:使用数据模型解析JSON

如果已经把JSON解析成了自定义模型(推荐这种方式,类型更安全),可以这样做:

// 先定义你的数据模型,根据实际JSON结构调整字段
struct Proposta: Codable {
    let ttc_proposta_tipo_id: String
    // 这里添加其他需要的字段,比如标题、内容等
}

class NavigationTest: UIViewController, UITableViewDataSource, UITableViewDelegate { 
    @IBOutlet weak var btnAddProposta: UIBarButtonItem! 
    @IBOutlet var tableView: UITableView! 
    let searchController = UISearchController(searchResultsController: nil) // 补全你的搜索控制器初始化
    var propostas: [Proposta] = [] // 存储所有解析后的JSON数据
    
    // 添加一个计算属性,自动过滤出符合条件的数据
    private var filteredValidPropostas: [Proposta] {
        return propostas.filter { $0.ttc_proposta_tipo_id == "e0eb2736-433e-475e-876d-bcc6b460e1e3" }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 设置tableView的数据源和代理
        tableView.dataSource = self
        tableView.delegate = self
        // 这里执行你的JSON解析逻辑,解析完成后赋值给propostas,然后刷新表格
        // 示例:parseJSON()
        // tableView.reloadData()
    }
    
    // MARK: - UITableView 数据源方法
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // 直接返回过滤后的数据数量,没有符合条件的就返回0
        return filteredValidPropostas.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // 替换成你实际使用的Cell标识符
        let cell = tableView.dequeueReusableCell(withIdentifier: "YourCellID", for: indexPath)
        // 获取当前行的有效数据
        let currentProposta = filteredValidPropostas[indexPath.row]
        // 配置Cell内容,比如:
        // cell.textLabel?.text = currentProposta.yourFieldName
        return cell
    }
}

情况2:直接使用字典数组存储JSON数据

如果还没使用模型,直接用[[String: Any]]存储解析后的JSON,可以调整过滤逻辑:

class NavigationTest: UIViewController, UITableViewDataSource, UITableViewDelegate { 
    @IBOutlet weak var btnAddProposta: UIBarButtonItem! 
    @IBOutlet var tableView: UITableView! 
    let searchController = UISearchController(searchResultsController: nil)
    var propostas: [[String: Any]] = [] // 用字典数组存储数据
    
    private var filteredValidPropostas: [[String: Any]] {
        return propostas.filter {
            // 先安全取出字段值,避免类型转换失败
            guard let tipoId = $0["ttc_proposta_tipo_id"] as? String else {
                return false
            }
            return tipoId == "e0eb2736-433e-475e-876d-bcc6b460e1e3"
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.dataSource = self
        tableView.delegate = self
        // 解析JSON后赋值并刷新表格
        // tableView.reloadData()
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return filteredValidPropostas.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "YourCellID", for: indexPath)
        let currentData = filteredValidPropostas[indexPath.row]
        // 配置Cell,比如:
        // if let title = currentData["your_title_key"] as? String {
        //     cell.textLabel?.text = title
        // }
        return cell
    }
}

关键注意点

  • 记得把代码中的YourCellID替换成你在Storyboard或者代码中注册的Cell标识符。
  • 当你的JSON数据更新后,一定要调用tableView.reloadData()来刷新表格,这样新的过滤结果才会生效。
  • 使用计算属性filteredValidPropostas的好处是不用每次调用数据源方法都重复过滤,性能更优,而且逻辑更清晰。

内容的提问来源于stack exchange,提问作者Caio Borsoi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:51:14