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值的行:
- 布局TableView:在View B的Storyboard里拖一个UITableView,设置约束让它占满整个屏幕,然后把ViewController设为TableView的
dataSource和delegate(可以直接在Storyboard里连线,或者代码里设置)。 - 整理要显示的条目:我们用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)) } }
- 实现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
相关产品推荐
相关产品推荐

