为了账号安全,请及时绑定邮箱和手机立即绑定

如何在SWIFT中在视图控制器和其他对象之间共享数据?

如何在SWIFT中在视图控制器和其他对象之间共享数据?

尚方宝剑之说 2019-06-19 11:12:30
如何在SWIFT中在视图控制器和其他对象之间共享数据?假设我在我的SWIFT应用程序中有多个视图控制器,我希望能够在它们之间传递数据。如果我在视图控制器堆栈中有几个层次,如何将数据传递给另一个视图控制器?还是在选项卡栏视图控制器中的选项卡之间?(注意,这个问题是“响铃人”。)人们对它的要求太高了,所以我决定写一篇关于这一主题的教程。见下面的答案。
查看完整描述

3 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

SWIFT 4

数据的快速传输有很多种方法。在这里,我要添加一些最好的方法。

1)使用故事板段

故事板分页格对于在源视图控制器和目标视图控制器之间传递数据非常有用,反之亦然。

// 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)使用代表法

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        }

    }


查看完整回答
反对 回复 2019-06-19
  • 3 回答
  • 0 关注
  • 764 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信