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

iOS视图中展示对象变量列表并隐藏nil值行(Swift)

嘿,作为从Android转过来的iOS新手,这种处理大量变量显示的场景我太懂了!毕竟Android里的Parcelable传数据和iOS的Segue传参思路不太一样,而且要搞定40个变量还得自动隐藏空值行,确实得找个高效的路子。下面给你一步步拆解:

第一步:先把数据正确传到View B

首先得确保你的数据类是类类型(当然结构体也能传,不过类更符合你之前Android对象的使用习惯),比如:

class DataModel: NSObject { // 继承NSObject是为了后面能用KVC遍历属性,省超多事
    var name: String?
    var age: Int?
    var isStudent: Bool?
    // ... 剩下37个字符串、整数、布尔类型的变量
}

然后在View A里重写prepare(for:sender:)方法,把数据传给View B:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // 记得给你的Segue在Storyboard里设置好唯一的identifier,比如"goToViewB"
    guard segue.identifier == "goToViewB",
          let viewB = segue.destination as? ViewBViewController else {
        return
    }
    // 把你准备好的DataModel实例传给View B的属性
    viewB.dataModel = yourDataInstance
}

在View B的ViewController里先声明接收数据的属性:

var dataModel: DataModel!
第二步:用UITableView动态生成行(高效处理40个变量)

手动拖40个Label绝对是噩梦,用UITableView动态生成行才是iOS开发的标准操作,还能自动过滤nil值的行:

  1. 布局TableView:在View B的Storyboard里拖一个UITableView,设置约束让它占满整个屏幕,然后把ViewController设为TableView的dataSource和delegate(可以直接在Storyboard里连线,或者代码里设置)。
  2. 整理要显示的条目:我们用KVC(键值编码)来遍历数据模型的属性,自动过滤掉nil值的变量,不用手动写40次判断!

在View B里添加一个数组来存储要显示的内容,然后在viewDidLoad里初始化:

// 每个元素存标题和对应的显示值
var displayItems: [(title: String, value: String)] = []

override func viewDidLoad() {
    super.viewDidLoad()
    // 注册Cell(如果没在Storyboard里设置Cell的identifier,就用这个代码注册)
    tableView.register(UITableViewCell.self, forCellReuseIdentifier: "DataCell")
    // 整理要显示的条目
    setupDisplayItems()
    // 刷新TableView
    tableView.reloadData()
}

private func setupDisplayItems() {
    // 这里要把DataModel里所有需要显示的属性名列出来,和类里的属性名完全一致(大小写也要对)
    let propertyNames = ["name", "age", "isStudent", /* ... 把剩下37个属性名都加上 */]
    
    for propertyName in propertyNames {
        // 用KVC获取当前属性的值
        guard let value = dataModel.value(forKey: propertyName) else {
            // 值为nil,直接跳过,不生成这一行
            continue
        }
        
        // 把不同类型的值转换成友好的显示字符串
        let valueStr: String
        switch value {
        case let boolValue as Bool:
            valueStr = boolValue ? "是" : "否" // 可以换成你需要的文本,比如"Yes"/"No"
        case let intValue as Int:
            valueStr = String(intValue)
        case let strValue as String:
            valueStr = strValue
        default:
            valueStr = "\(value)" // 兜底处理其他可能的类型
        }
        
        // 添加到显示数组里
        displayItems.append((title: propertyName, value: valueStr))
    }
}
  1. 实现TableView的数据源方法:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // 有多少个非nil的变量,就显示多少行
    return displayItems.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "DataCell", for: indexPath)
    let item = displayItems[indexPath.row]
    // 默认Cell的textLabel显示标题,detailTextLabel显示值
    cell.textLabel?.text = item.title
    cell.detailTextLabel?.text = item.value
    return cell
}
第三步:可选优化(让界面更顺手)
  • 自定义Cell:默认Cell的样式可能不够好看,你可以创建一个自定义UITableViewCell,左边放标题Label,右边放值Label,调整字体、颜色、间距,让界面更符合iOS设计风格。
  • 过滤空字符串:如果你的字符串变量是空字符串(不是nil)也想隐藏,就在setupDisplayItems里加判断:比如遇到String类型时,if strValue.isEmpty { continue }。
  • 自动获取属性名:如果不想手动写40个属性名,可以用Runtime的方法获取类的所有属性,不过对于新手来说,手动列出来更直观,不容易出错。
为啥不用手动拖Label?

40个变量手动拖Label不仅工作量大,以后要修改、增减变量时,维护成本超高。用TableView的话,只需要调整propertyNames数组就行,灵活又高效,这也是iOS处理动态列表的常规操作。

内容的提问来源于stack exchange,提问作者David Gay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:38:25