iOS页面跳转传参的几种实用方式

在开发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")

就像把钥匙放在门口鞋柜上,方便拿取,但别把保险箱密码也放那儿。