简体   繁体   English

如何在UIViewControllers与协议/委托之间传递数据

[英]How to pass data between UIViewControllers with protocols/delegates

In the code below I have a ViewController ("SenderViewController"), which passes a message to the main ViewController when a button is tapped. 在下面的代码中,我有一个ViewController (“SenderViewController”),它在点击按钮时将消息传递给主ViewController What I don't fully understand is how does messageData() method in the main ViewController know when to listen for the message. 我不完全理解的是,主ViewController中的messageData()方法如何知道何时监听消息。

Can someone please explain me what is triggering the messageData() method in the main ViewController ? 有人可以解释一下在主ViewController触发messageData()方法的原因是什么?

SenderViewController: SenderViewController:

import UIKit  
protocol SenderViewControllerDelegate {  
    func messageData(data: AnyObject)  
}  
class SenderViewController: UIViewController {  
    @IBOutlet weak var inputMessage: UITextField!  
     var delegate: SenderViewControllerDelegate?  

    @IBAction func sendData(sender: AnyObject) {  
        /  
        if inputMessage.text != ""{  
            self.presentingViewController!.dismissViewControllerAnimated(true, completion: nil)  
            self.delegate?.messageData(inputMessage.text!)  
        }  
    }  
}  

Main ViewController: 主ViewController:

import UIKit  
class ViewController: UIViewController, SenderViewControllerDelegate{  
    @IBOutlet weak var showData: UILabel!  

    override func viewDidLoad() {  
        super.viewDidLoad()  
    }  

    @IBAction func goToView(sender: AnyObject) {  
        let pvc = storyboard?.instantiateViewControllerWithIdentifier("senderViewController") as! SenderViewController  
        pvc.delegate = self  
        self.presentViewController(pvc, animated:true, completion:nil)  
    }  

   // What triggers this method, how it know when to listen? 
    func messageData(data: AnyObject) {  
        self.showData.text = "\(data)"  
    }  
} 

Thanks a lot! 非常感谢!

Objects don't exactly listen for method calls. 对象并不完全听取方法调用。 They sit there, waiting to invoked. 他们坐在那里,等待援引。

The line 这条线

self.delegate?.messageData(inputMessage.text!)

From your SenderViewController is a function call. 从你的SenderViewController是一个函数调用。 (The term method and function are pretty much interchangeable, although the method is usually used for the functions of objects.) It invokes the function messageData in ViewController . (术语方法和函数几乎可以互换,尽管该method通常用于对象的函数。)它在ViewController调用函数messageData。

While Presenting SenderViewController from MainViewController you are setting the delegate as self . MainViewController呈现SenderViewController ,您将委托设置为self So whenever you call the delegate method in SenderViewController 所以每当你在SenderViewController中调用delegate方法时

self.delegate?.messageData(inputMessage.text!)

following method of MainViewController will act as a callback 以下MainViewController方法将充当回调

func messageData(data: AnyObject) {  
        self.showData.text = "\(data)"  
    } 

In SenderViewController : SenderViewController

When you tap button you invoke sendData method. 当您点击按钮时,您将调用sendData方法。 In this method you ask delegate to invoke its messageData method. 在此方法中,您要求delegate调用其messageData方法。 Delegate property declared as SenderViewControllerDelegate type, so you can do that (see this protocol defenition). 委托声明为SenderViewControllerDelegate类型的属性,因此您可以这样做(请参阅此协议防御)。

In ViewController (first view controller): ViewController (第一个视图控制器)中:

Before you open second view controller, in method goToView you seting up property delegate of SenderViewController to 'myself', to exact instance of ViewController , since you declared that it confirm protocol SenderViewControllerDelegate by implementing method messageData . 在您打开第二个视图控制器,在方法goToView你塞汀了产权delegateSenderViewController为“自己”,到精确的实例ViewController ,因为你宣布,确认协议SenderViewControllerDelegate通过实施方法messageData So, ViewController is now saved as delegate property in SenderViewController , and can be used to invoke messageData ! 因此, ViewController现在在SenderViewController保存为delegate属性,可用于调用messageData

self.delegate?.messageData(inputMessage.text!)
@IBAction func sendData(sender: AnyObject) {  

    if inputMessage.text != ""{  
        self.delegate?.messageData(inputMessage.text!)  
        self.presentingViewController!.dismissViewControllerAnimated(true, completion: nil)  

    }else{
       //handle here
}

Note: If you need to pass multiple data to mainViewController then use dictionary to pass them. 注意:如果需要将多个数据传递给mainViewController,请使用字典传递它们。 ie

SenderViewController: SenderViewController:

import UIKit  
protocol SenderViewControllerDelegate {  
    func messageData(data: [String : Any])  
}  
class SenderViewController: UIViewController {  
    @IBOutlet weak var inputMessage: UITextField!  
    var delegate: SenderViewControllerDelegate?  

    @IBAction func sendData(sender: AnyObject) {  

        let myDict = [ "name": "Name", "age": 21, "email": "test@gmail.com"] as! [String : Any]

        self.delegate?.messageData(myDict) 
        self.presentingViewController!.dismissViewControllerAnimated(true, completion: nil)  


  }  
}  

Main ViewController 主ViewController

import UIKit  
class ViewController: UIViewController, SenderViewControllerDelegate{  
    @IBOutlet weak var showData: UILabel!  

    override func viewDidLoad() {  
        super.viewDidLoad()  
    }  

    @IBAction func goToView(sender: AnyObject) {  
        let pvc = storyboard?.instantiateViewControllerWithIdentifier("senderViewController") as! SenderViewController  
        pvc.delegate = self  
        self.presentViewController(pvc, animated:true, completion:nil)  
    }  

   // What triggers this method, how it know when to listen? 
    func messageData(data: [String : Any]) {  
        print(data["name"])  
        print(data["age"])  
        print(data["email"])  

    }  
} 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在UIViewControllers之间传递数据 - pass data between UIViewControllers 如何在不同的UIViewControllers之间传递数据? - How to pass data between different UIViewControllers? 如何在UIViewControllers之间传递数据而不显示它 - How to pass data between UIViewControllers without presenting it 如何在UIPageViewController中的UIViewControllers之间传递数据并保存变量 - How should I pass data between UIViewControllers in UIPageViewController and save variables 如何通过@objc函数在UIViewControllers之间传递数据数组 - How to pass array of data between UIViewControllers from @objc function 如何在布局类似于叉子的UIViewControllers之间导航和传递数据? - How to navigate and pass data between UIViewControllers whose layout resembles a fork? 通过委托/协议传递数据 - Passing data with delegates/protocols 如何在不使用委托和协议的情况下将数据从编程创建的UIPopoverController传递到ViewController的情况下传递数据? - How can I pass data without using segues from programmatically created UIPopoverController to ViewController using delegates and protocols? 使用委托/协议将数据传递给第三方视图控制器 - using delegates/protocols to pass data to third party view controller 如何在 Swift 中正确实现不同视图控制器之间的协议和委托? - How to properly implement protocols and delegates between different view controllers in Swift?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM