9

在下面的代码中,我有一个(“SenderViewController”),它在点击按钮时ViewController将消息传递给主。ViewController我不完全理解的是messageData()主要方法如何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!)  
        }  
    }  
}  

主视图控制器:

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

非常感谢!

4

5 回答 5

5

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

线

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

从你的SenderViewController是一个函数调用。(术语方法和函数几乎可以互换,尽管method通常用于对象的函数。)它调用函数 messageData 在ViewController.

于 2016-08-02T13:16:30.280 回答
3

在您进行演示SenderViewController时,MainViewController将代表设置为self. 因此,每当您在 SenderViewController 中调用委托方法时

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

以下方法MainViewController将充当回调

func messageData(data: AnyObject) {  
        self.showData.text = "\(data)"  
    } 
于 2016-08-02T13:19:03.047 回答
3

SenderViewController

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

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

在打开第二个视图控制器之前,在方法中将goToView属性delegate设置SenderViewController为“我自己”,以精确实例ViewController,因为您声明它SenderViewControllerDelegate通过实现方法确认协议messageData。所以,ViewController现在保存为delegate属性SenderViewController,可以用来调用messageData

于 2016-08-02T13:19:29.407 回答
2
self.delegate?.messageData(inputMessage.text!)
于 2016-08-02T13:46:00.170 回答
0
@IBAction func sendData(sender: AnyObject) {  

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

    }else{
       //handle here
}

注意:如果您需要向 mainViewController 传递多个数据,请使用字典来传递它们。IE

发件人视图控制器:

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)  


  }  
}  

主视图控制器

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

    }  
} 
于 2018-12-18T08:14:13.793 回答