如何根据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
相关产品推荐
相关产品推荐

