如何使用 protocols/delegates 在 UIViewController 之间传递数据
How to pass data between UIViewControllers with protocols/delegates
在下面的代码中,我有一个 ViewController
("SenderViewController"),它会在点击按钮时将消息传递给主 ViewController
。我不完全明白的是 messageData()
方法在主 ViewController
中如何知道何时收听消息。
谁能解释一下是什么触发了主要 ViewController
中的 messageData()
方法?
发件人ViewController:
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)"
}
}
非常感谢!
对象并不完全监听方法调用。他们坐在那里,等待调用。
行
self.delegate?.messageData(inputMessage.text!)
来自您的 SenderViewController
是一个函数调用。 (术语方法和函数几乎可以互换,尽管 method
通常用于对象的功能。)它调用 ViewController
.
中的函数 messageData
从 MainViewController
展示 SenderViewController
时,您将代表设置为 self
。因此,每当您在 SenderViewController
中调用委托方法时
self.delegate?.messageData(inputMessage.text!)
MainViewController
的以下方法将作为回调
func messageData(data: AnyObject) {
self.showData.text = "\(data)"
}
在SenderViewController
中:
当您点击按钮时,您会调用 sendData
方法。在此方法中,您要求 delegate
调用其 messageData
方法。委托 属性 声明为 SenderViewControllerDelegate
类型,因此您可以这样做(请参阅此协议定义)。
在ViewController
(第一个视图控制器)中:
在打开第二个视图控制器之前,在方法 goToView
中,您将 SenderViewController
的 属性 delegate
设置为 'myself',以精确实例 ViewController
,因为你声明它通过实现方法 messageData
来确认协议 SenderViewControllerDelegate
。所以,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
}
注意:如果您需要将多个数据传递给 mainViewController 然后使用字典来传递它们。即
发件人ViewController:
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)
}
}
主要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"])
}
}
在下面的代码中,我有一个 ViewController
("SenderViewController"),它会在点击按钮时将消息传递给主 ViewController
。我不完全明白的是 messageData()
方法在主 ViewController
中如何知道何时收听消息。
谁能解释一下是什么触发了主要 ViewController
中的 messageData()
方法?
发件人ViewController:
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)"
}
}
非常感谢!
对象并不完全监听方法调用。他们坐在那里,等待调用。
行
self.delegate?.messageData(inputMessage.text!)
来自您的 SenderViewController
是一个函数调用。 (术语方法和函数几乎可以互换,尽管 method
通常用于对象的功能。)它调用 ViewController
.
从 MainViewController
展示 SenderViewController
时,您将代表设置为 self
。因此,每当您在 SenderViewController
self.delegate?.messageData(inputMessage.text!)
MainViewController
的以下方法将作为回调
func messageData(data: AnyObject) {
self.showData.text = "\(data)"
}
在SenderViewController
中:
当您点击按钮时,您会调用 sendData
方法。在此方法中,您要求 delegate
调用其 messageData
方法。委托 属性 声明为 SenderViewControllerDelegate
类型,因此您可以这样做(请参阅此协议定义)。
在ViewController
(第一个视图控制器)中:
在打开第二个视图控制器之前,在方法 goToView
中,您将 SenderViewController
的 属性 delegate
设置为 'myself',以精确实例 ViewController
,因为你声明它通过实现方法 messageData
来确认协议 SenderViewControllerDelegate
。所以,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
}
注意:如果您需要将多个数据传递给 mainViewController 然后使用字典来传递它们。即
发件人ViewController:
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)
}
}
主要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"])
}
}