如何实现 UIViewController 之间的数据传递?

简介: 如何实现 UIViewController 之间的数据传递?

在 iOS 中,有多种方式可以实现 UIViewController 之间的数据传递。以下是一些常用的方法:

  1. 属性传递:

    • 在目标 UIViewController 中定义一个属性,并在源 UIViewController 中设置该属性的值。
    • 示例:

      // 在目标 UIViewController 中定义属性
      class DestinationViewController: UIViewController {
             
          var receivedData: String?
          // ...
      }
      
      // 在源 UIViewController 中设置属性值
      let destinationVC = DestinationViewController()
      destinationVC.receivedData = "Hello from source VC"
      
  2. 构造函数传递:

    • 在目标 UIViewController 的构造函数中添加参数,并在创建目标视图控制器的时候传递数据。
    • 示例:

      class DestinationViewController: UIViewController {
             
          var receivedData: String?
      
          // 构造函数接收数据
          init(data: String) {
             
              super.init(nibName: nil, bundle: nil)
              self.receivedData = data
          }
      }
      
      // 创建目标 UIViewController 时传递数据
      let destinationVC = DestinationViewController(data: "Hello from source VC")
      
  3. 委托模式:

    • 使用委托模式,源 UIViewController 成为目标 UIViewController 的委托,并定义委托方法传递数据。
    • 示例:

      protocol DataDelegate: AnyObject {
             
          func sendData(data: String)
      }
      
      class SourceViewController: UIViewController {
             
          weak var delegate: DataDelegate?
      
          // 在适当的时机调用委托方法
          func sendDataToDestination() {
             
              delegate?.sendData(data: "Hello from source VC")
          }
      }
      
      class DestinationViewController: UIViewController, DataDelegate {
             
          // 实现委托方法接收数据
          func sendData(data: String) {
             
              print("Received data: \(data)")
          }
      
          // 在源 UIViewController 中设置委托
          let sourceVC = SourceViewController()
          sourceVC.delegate = self
      
  4. 通知中心:

    • 使用 NotificationCenter 发送通知,源 UIViewController 发送通知,目标 UIViewController 监听通知。
    • 示例:

      // 在源 UIViewController 中发送通知
      NotificationCenter.default.post(name: NSNotification.Name("DataNotification"), object: nil, userInfo: ["data": "Hello from source VC"])
      
      // 在目标 UIViewController 中监听通知
      NotificationCenter.default.addObserver(self, selector: #selector(handleDataNotification(_:)), name: NSNotification.Name("DataNotification"), object: nil)
      
      @objc func handleDataNotification(_ notification: Notification) {
             
          if let data = notification.userInfo?["data"] as? String {
             
              print("Received data: \(data)")
          }
      

这些方法可以根据实际需求选择使用,通常会根据具体场景和数据传递的复杂程度来选择最合适的方式。每种方式都有其适用的场景,开发者可以根据需求选择最符合项目架构和代码风格的方法。

相关文章
|
C++
Qt 父子对象的关系
Qt 父子对象的关系
106 0
|
3月前
|
缓存 小程序 数据库
小程序页面之间(传值)传递数据的方法
小程序页面之间(传值)传递数据的方法
187 63
|
6月前
|
存储 编译器 C语言
C与C++之间相互调用的基本方法
C与C++之间相互调用的基本方法
123 1
|
6月前
|
存储 前端开发 JavaScript
多个页面之间如何进行数据传递
多个页面之间如何进行数据传递
201 0
|
设计模式 开发框架 开发者
组件封装使用?
组件封装使用?
|
Android开发
浅谈组件之间的通信—EventBus
EventBus是一款针对Andoid优化的发布/订阅事件总线,主要功能是替Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息,优点是开销小,代码更优雅,以及将发送者和接收者进行解耦
139 0
|
XML Java 数据格式
Fragment之间传递数据
画面显示(XML) 首先这是一个Activit显示上有两个Fragment容器,是为了显示两个Fragment。 然后Activity加载了两个Fragment的数据并依次replace到了两个容器中。 此时Activity就有了两个Fragment的对象,方便后续FragmentA获取FragmentB。
149 0
AVPlayerItem、AVPlayer、AVPlayerLayer三者关系
AVPlayerItem、AVPlayer、AVPlayerLayer三者关系
74 0
|
缓存 Android开发
怎么理解 onStart可见但不可交互
onStart生命周期表示Activity可见,那为什么不能交互呢
148 0
怎么理解 onStart可见但不可交互