How to pass data between UIViewControllers with protocols/delegates

12,248

Solution 1

Objects don't exactly listen for method calls. They sit there, waiting to invoked.

The line

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

From your SenderViewController is a function call. (The term method and function are pretty much interchangeable, although the method is usually used for the functions of objects.) It invokes the function messageData in ViewController.

Solution 2

While Presenting SenderViewController from MainViewController you are setting the delegate as self. So whenever you call the delegate method in SenderViewController

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

following method of MainViewController will act as a callback

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

Solution 3

In SenderViewController:

When you tap button you invoke sendData method. In this method you ask delegate to invoke its messageData method. Delegate property declared as SenderViewControllerDelegate type, so you can do that (see this protocol defenition).

In ViewController (first view controller):

Before you open second view controller, in method goToView you seting up property delegate of SenderViewController to 'myself', to exact instance of ViewController, since you declared that it confirm protocol SenderViewControllerDelegate by implementing method messageData. So, ViewController is now saved as delegate property in SenderViewController, and can be used to invoke messageData!

Solution 4

self.delegate?.messageData(inputMessage.text!)
Share:
12,248

Related videos on Youtube

fs_tigre
Author by

fs_tigre

Updated on September 23, 2022

Comments

  • fs_tigre
    fs_tigre over 1 year

    In the code below I have a ViewController("SenderViewController"), which passes a message to the main ViewController when a button is tapped. What I don't fully understand is how does messageData() method in the main ViewController know when to listen for the message.

    Can someone please explain me what is triggering the messageData() method in the main ViewController?

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

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

    Thanks a lot!

    • iphonic
      iphonic almost 8 years
      This call self.delegate?.messageData from func sendData in SenderViewController is executing it.
    • Anupam Mishra
      Anupam Mishra almost 8 years
      Follow this tutorial, you will get your answer - tutorialspoint.com/ios/ios_delegates.htm
  • fs_tigre
    fs_tigre almost 8 years
    Thanks a lot for your input.