如何使用 protocols/delegates 在 UIViewController 之间传递数据

How to pass data between UIViewControllers with protocols/delegates

在下面的代码中,我有一个 ViewController("SenderViewController"),它会在点击按钮时将消息传递给主 ViewController。我不完全明白的是 messageData() 方法在主 ViewController 中如何知道何时收听消息。

谁能解释一下是什么触发了主要 ViewController 中的 messageData() 方法?

发件人ViewController:

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!)  
        }  
    }  
}  

主要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)"  
    }  
} 

非常感谢!

对象并不完全监听方法调用。他们坐在那里,等待调用。

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

来自您的 SenderViewController 是一个函数调用。 (术语方法和函数几乎可以互换,尽管 method 通常用于对象的功能。)它调用 ViewController.

中的函数 messageData

MainViewController 展示 SenderViewController 时,您将代表设置为 self。因此,每当您在 SenderViewController

中调用委托方法时
self.delegate?.messageData(inputMessage.text!)

MainViewController 的以下方法将作为回调

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

SenderViewController中:

当您点击按钮时,您会调用 sendData 方法。在此方法中,您要求 delegate 调用其 messageData 方法。委托 属性 声明为 SenderViewControllerDelegate 类型,因此您可以这样做(请参阅此协议定义)。

ViewController(第一个视图控制器)中:

在打开第二个视图控制器之前,在方法 goToView 中,您将 SenderViewController 的 属性 delegate 设置为 'myself',以精确实例 ViewController,因为你声明它通过实现方法 messageData 来确认协议 SenderViewControllerDelegate。所以,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
}

注意:如果您需要将多个数据传递给 mainViewController 然后使用字典来传递它们。即

发件人ViewController:

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)  


  }  
}  

主要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"])  

    }  
}