[英]How to pass data between UIViewControllers with protocols/delegates
In the code below I have a ViewController
("SenderViewController"), which passes a message to the main ViewController
when a button is tapped. 在下面的代码中,我有一个ViewController
(“SenderViewController”),它在点击按钮时将消息传递给主ViewController
。 What I don't fully understand is how does messageData()
method in the main ViewController
know when to listen for the message. 我不完全理解的是,主ViewController
中的messageData()
方法如何知道何时监听消息。
Can someone please explain me what is triggering the messageData()
method in the main ViewController
? 有人可以解释一下在主ViewController
触发messageData()
方法的原因是什么?
SenderViewController: 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: 主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! 非常感谢!
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. 从你的SenderViewController
是一个函数调用。 (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
. (术语方法和函数几乎可以互换,尽管该method
通常用于对象的函数。)它在ViewController
调用函数messageData。
While Presenting SenderViewController
from MainViewController
you are setting the delegate as self
. 从MainViewController
呈现SenderViewController
,您将委托设置为self
。 So whenever you call the delegate method in SenderViewController 所以每当你在SenderViewController中调用delegate方法时
self.delegate?.messageData(inputMessage.text!)
following method of MainViewController
will act as a callback 以下MainViewController
方法将充当回调
func messageData(data: AnyObject) {
self.showData.text = "\(data)"
}
In SenderViewController
: 在SenderViewController
:
When you tap button you invoke sendData
method. 当您点击按钮时,您将调用sendData
方法。 In this method you ask delegate
to invoke its messageData
method. 在此方法中,您要求delegate
调用其messageData
方法。 Delegate property declared as SenderViewControllerDelegate
type, so you can do that (see this protocol defenition). 委托声明为SenderViewControllerDelegate
类型的属性,因此您可以这样做(请参阅此协议防御)。
In ViewController
(first view controller): 在ViewController
(第一个视图控制器)中:
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
. 在您打开第二个视图控制器,在方法goToView
你塞汀了产权delegate
的SenderViewController
为“自己”,到精确的实例ViewController
,因为你宣布,确认协议SenderViewControllerDelegate
通过实施方法messageData
。 So, ViewController
is now saved as delegate
property in SenderViewController
, and can be used to invoke messageData
! 因此, ViewController
现在在SenderViewController
保存为delegate
属性,可用于调用messageData
!
self.delegate?.messageData(inputMessage.text!)
@IBAction func sendData(sender: AnyObject) {
if inputMessage.text != ""{
self.delegate?.messageData(inputMessage.text!)
self.presentingViewController!.dismissViewControllerAnimated(true, completion: nil)
}else{
//handle here
}
Note: If you need to pass multiple data to mainViewController then use dictionary to pass them. 注意:如果需要将多个数据传递给mainViewController,请使用字典传递它们。 ie 即
SenderViewController: SenderViewController:
import UIKit
protocol SenderViewControllerDelegate {
func messageData(data: [String : Any])
}
class SenderViewController: UIViewController {
@IBOutlet weak var inputMessage: UITextField!
var delegate: SenderViewControllerDelegate?
@IBAction func sendData(sender: AnyObject) {
let myDict = [ "name": "Name", "age": 21, "email": "test@gmail.com"] as! [String : Any]
self.delegate?.messageData(myDict)
self.presentingViewController!.dismissViewControllerAnimated(true, completion: nil)
}
}
Main ViewController 主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: [String : Any]) {
print(data["name"])
print(data["age"])
print(data["email"])
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.