2016-08-02 103 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!) 
相關問題