How do you share data between view controllers and other objects in Swift?

后端 未结 8 1210
长情又很酷
长情又很酷 2020-11-22 02:15

Say I have multiple view controllers in my Swift app and I want to be able to pass data between them. If I\'m several levels down in a view controller stack, how do I pass d

8条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2020-11-22 02:56

    Swift 4

    There are so many approaches for data passing in swift. Here I am adding some of the best approaches of it.

    1) Using StoryBoard Segue

    Storyboard segues are very much useful for passing data in between Source and Destination View Controllers and vice versa also.

    // If you want to pass data from ViewControllerB to ViewControllerA while user tap on back button of ViewControllerB.
            @IBAction func unWindSeague (_ sender : UIStoryboardSegue) {
                if sender.source is ViewControllerB  {
                    if let _ = sender.source as? ViewControllerB {
                        self.textLabel.text = "Came from B = B->A , B exited"
                    }
                }
            }
    
    // If you want to send data from ViewControllerA to ViewControllerB
            override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
                if  segue.destination is ViewControllerB {
                    if let vc = segue.destination as? ViewControllerB {
                        vc.dataStr = "Comming from A View Controller"
                    }
                }
            }
    

    2) Using Delegate Methods

    ViewControllerD

    //Make the Delegate protocol in Child View Controller (Make the protocol in Class from You want to Send Data)
        protocol  SendDataFromDelegate {
            func sendData(data : String)
        }
    
        import UIKit
    
        class ViewControllerD: UIViewController {
    
            @IBOutlet weak var textLabelD: UILabel!
    
            var delegate : SendDataFromDelegate?  //Create Delegate Variable for Registering it to pass the data
    
            override func viewDidLoad() {
                super.viewDidLoad()
                // Do any additional setup after loading the view.
                textLabelD.text = "Child View Controller"
            }
    
            @IBAction func btnDismissTapped (_ sender : UIButton) {
                textLabelD.text = "Data Sent Successfully to View Controller C using Delegate Approach"
                self.delegate?.sendData(data:textLabelD.text! )
                _ = self.dismiss(animated: true, completion:nil)
            }
        }
    

    ViewControllerC

        import UIKit
    
        class ViewControllerC: UIViewController , SendDataFromDelegate {
    
            @IBOutlet weak var textLabelC: UILabel!
    
            override func viewDidLoad() {
                super.viewDidLoad()
                // Do any additional setup after loading the view.
            }
    
            @IBAction func btnPushToViewControllerDTapped( _ sender : UIButton) {
                if let vcD = self.storyboard?.instantiateViewController(withIdentifier: "ViewControllerD") as?  ViewControllerD  {
                    vcD.delegate = self // Registring Delegate (When View Conteoller D gets Dismiss It can call sendData method
        //            vcD.textLabelD.text = "This is Data Passing by Referenceing View Controller D Text Label." //Data Passing Between View Controllers using Data Passing
                    self.present(vcD, animated: true, completion: nil)
                }
            }
    
            //This Method will called when when viewcontrollerD will dismiss. (You can also say it is a implementation of Protocol Method)
            func sendData(data: String) {
                self.textLabelC.text = data
            }
    
        }
    

提交回复
热议问题