2016-08-02 8 views
4

以下のコードでは、ViewController( "SenderViewController")があり、ボタンをタップするとViewControllerにメッセージが渡されます。私が完全に理解していないのは、ViewControllermessageData()メソッドがメッセージを聞くタイミングを知る方法です。プロトコル/デリゲートを使用してUIViewController間でデータを渡す方法

ViewControllermessageData()メソッドをトリガーしていることを教えてもらえますか?

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

この呼び出しは、 'SenderViewController'の 'func sendData'から' self.delegate?.messageData'を実行しています。 – iphonic

+1

このチュートリアルに従うと、あなたはあなたの答えを得るでしょう - http://www.tutorialspios.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

オブジェクトは、メソッド呼び出しを正確にリッスンしません。彼らはそこに座り、呼び出されるのを待っている。あなたのSenderViewControllerから

ライン

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

は、関数呼び出しです。 (メソッドと関数という用語は、かなり互換性がありますが、通常はオブジェクトの関数にはmethodが使用されます)。ViewControllerのmessageData関数を呼び出します。

+0

ありがとうございました。 –

3

SenderViewControllerMainViewControllerから提示している間は、代理人をselfと設定しています。あなたはsendDataメソッドを呼び出すボタンをタップすると

:だからあなたはMainViewControllerの方法に従ってSenderViewController

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

でデリゲートメソッドを呼び出したときには、コールバックSenderViewController

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

お寄せいただきありがとうございます。 –

3

として機能します。この方法ではdelegatemessageDataメソッドを呼び出してください。 SenderViewControllerDelegate型として宣言されたデリゲートプロパティを使用することができます(このプロトコルのdefenitionを参照してください)。

ViewController(最初のビューコントローラ)では:あなたはそれを確認することを宣言したので、

あなたは2番目のビューコントローラを開く前に、この方法であなたは、ViewControllerの正確なインスタンスに、「自分自身を」にSenderViewControllerのプロパティdelegateをSETING goToView方法messageDataを実装して、プロトコルSenderViewControllerDelegateを実行します。したがって、ViewControllerはにdelegateプロパティとして保存され、messageDataを呼び出すために使用できます。

+0

感謝します、ありがとうございます。 –

2
self.delegate?.messageData(inputMessage.text!) 
関連する問題