How to pass data between UIViewControllers with protocols/delegates
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!)
Related videos on Youtube
fs_tigre
Updated on September 23, 2022Comments
-
fs_tigre over 1 year
In the code below I have a
ViewController
("SenderViewController"), which passes a message to the mainViewController
when a button is tapped. What I don't fully understand is how doesmessageData()
method in the mainViewController
know when to listen for the message.Can someone please explain me what is triggering the
messageData()
method in the mainViewController
?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 almost 8 yearsThis call
self.delegate?.messageData
fromfunc sendData
inSenderViewController
is executing it. -
Anupam Mishra almost 8 yearsFollow this tutorial, you will get your answer - tutorialspoint.com/ios/ios_delegates.htm
-
-
fs_tigre almost 8 yearsThanks a lot for your input.