2016-08-02 72 views
4

在下面的代码中,我有一个ViewController(“SenderViewController”),它在点击按钮时将消息传递给主要的ViewController。我不完全明白的是messageData()方法在主要的ViewController中知道何时收听消息。如何通过协议/代理在UIViewControllers之间传递数据

有人能解释一下,在主ViewController中触发messageData()方法是什么?

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

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

非常感谢!

+1

这个调用'self.delegate?.messageData'来自'SenderViewController'中的'func sendData'正在执行它。 – iphonic

+1

按照本教程,您将得到您的答案 - http://www.tutorialspoint.com/ios/ios_delegates.htm –

+0

使用委托swift 4.0传递数据:https://iosdevcenters.blogspot.com/2017/11/what- is-protocol-how-to-pop-data-using.html – Bhadresh

回答

2

对象不完全监听方法调用。他们坐在那里等着援引。

线

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

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

+0

明白了,非常感谢。 –

3

While Presenting SenderViewController from MainViewController您将代表设置为self。所以每当你调用委托方法在SenderViewController

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

以下的MainViewController方法作为回调

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

非常感谢您的意见。 –

3

法案SenderViewController

当您点击按钮调用sendData方法。在这种方法中,您可以要求delegate调用其方法messageData。代表属性声明为SenderViewControllerDelegate类型,所以你可以做到这一点(见协议defenition)。

ViewController(第一视图控制器):

在您打开第二个视图控制器,在方法goToView你塞汀了财产delegateSenderViewController为“自己”,到ViewController确切实例,因为你宣布,确认协议SenderViewControllerDelegate通过实施方法messageData。所以,ViewController现在保存为delegate财产SenderViewController,并可用于调用messageData

+0

有道理,非常感谢。 –

2
self.delegate?.messageData(inputMessage.text!) 
相关问题