在开发iOS应用时,页面之间的跳转和数据传递是再常见不过的需求。比如从商品列表点击进入详情页,要把商品ID带过去;或者用户填写完信息后返回上一页,需要把数据传回去。这些场景都离不开页面跳转传参。
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.itemId = selectedItemId
}
}
这里的 selectedItemId 就是从当前页面传过去的参数。注意要在目标控制器中提前定义好接收属性。
初始化时直接传参
如果用代码创建控制器,可以在实例化时直接传值。这种方式更灵活,适合纯代码或SwiftUI混合项目。
let detailVC = DetailViewController()
detailVC.itemId = 123
navigationController?.pushViewController(detailVC, animated: true)
简单直接,就像去便利店买水,拿起来就走,不用绕路。
闭包回调传值
从第二个页面回传数据到前一个页面,闭包是个好办法。比如在设置页选择性别后,回到个人主页刷新显示。
class SettingsViewController: UIViewController {
var onGenderSelected: ((String) -> Void)?
@IBAction func didSelectMale() {
onGenderSelected?("男")
navigationController?.popViewController(animated: true)
}
}
在跳转时设置闭包:
let settingsVC = SettingsViewController()
settingsVC.onGenderSelected = { selected in
self.genderLabel.text = selected
}
使用通知中心
当页面层级较深,或者多个页面需要响应同一事件时,可以考虑用 NotificationCenter。比如登录状态变化后,多个页面都需要更新头像和昵称。
// 发送通知
NotificationCenter.default.post(name: NSNotification.Name("UserLoggedIn"), object: userInfo)
// 接收通知
NotificationCenter.default.addObserver(self, selector: #selector(updateUserInfo), name: NSNotification.Name("UserLoggedIn"), object: nil)
记得在不需要时移除观察者,避免内存泄漏。
全局存储临时数据
对于一些简单的共享数据,比如用户token、设备ID,可以存在UserDefaults里。但要注意别滥用,这里不适合存大量或敏感信息。
UserDefaults.standard.set("abc123", forKey: "userId")
let userId = UserDefaults.standard.string(forKey: "userId")
就像把钥匙放在门口鞋柜上,方便拿取,但别把保险箱密码也放那儿。