在使用iPhone开发应用时,页面之间传递数据是再常见不过的操作。比如你在一个购物App里选好了商品,点击“去结算”时,需要把商品的价格、名称和数量带到下一个页面。这时候,页面跳转传参就派上用场了。
通过UIStoryboardSegue传参
如果你用的是Storyboard,最常见的方法就是在segue中传值。在第一个页面中重写 prepare(for:sender:) 方法,判断目标控制器类型后直接赋值。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showDetail" {
let destinationViewController = segue.destination as? DetailViewController
destinationViewController?.productName = "无线耳机"
destinationViewController?.productPrice = 299
}
}
这种方式适合从列表页跳转到详情页的场景,代码清晰,维护方便。
通过初始化方法手动传参
有时候你不想依赖Storyboard,可以用纯代码方式跳转。比如从当前控制器手动创建下一个页面的实例,把参数传过去。
let detailVC = DetailViewController()
detailVC.productName = "蓝牙音箱"
detailVC.productPrice = 599
navigationController?.pushViewController(detailVC, animated: true)
这种写法灵活,适合模块化较强的项目,也能避免segue标识符写错的问题。
使用闭包反向传值
跳转过去之后,如果用户在第二个页面做了修改,比如改了收货地址,怎么把新数据带回前一个页面?可以用闭包。
let editVC = EditAddressViewController()
editVC.onAddressSaved = { newAddress in
self.deliveryAddressLabel.text = newAddress
}
present(editVC, animated: true)
在目标页面定义一个闭包属性,操作完成时调用它,就能实现数据回传,体验流畅自然。
利用UserDefaults临时存取
对于一些简单的状态信息,比如用户是否第一次进入页面,可以临时用UserDefaults存储。
UserDefaults.standard.set(true, forKey: "hasSeenTutorial")
下次启动时读取这个值,决定是否展示引导页。虽然不是严格的“跳转传参”,但在跨页面共享轻量数据时很实用。
注意内存和数据安全
传参时别把大对象或敏感信息直接塞进去。比如不要把整个用户密码明文传给下一个页面,尽量只传必要字段。同时留意循环引用,尤其是使用闭包时记得加 [weak self]。