如何通过协议/代理在UIViewControllers之间传递数据
在下面的代码中,我有一个ViewController
(“SenderViewController”),它在点击按钮时将消息传递给主要的ViewController
。我不完全明白的是messageData()
方法在主要的ViewController
中知道何时收听消息。如何通过协议/代理在UIViewControllers之间传递数据
有人能解释一下,在主ViewController
中触发messageData()
方法是什么?
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)"
}
}
非常感谢!
对象不完全监听方法调用。他们坐在那里等着援引。
线
self.delegate?.messageData(inputMessage.text!)
从你SenderViewController
是一个函数调用。 (术语方法和函数几乎可以互换,尽管method
通常用于对象的功能。)它调用ViewController
中的函数messageData。
明白了,非常感谢。 –
While Presenting SenderViewController
from MainViewController
您将代表设置为self
。所以每当你调用委托方法在SenderViewController
self.delegate?.messageData(inputMessage.text!)
以下的MainViewController
方法作为回调
func messageData(data: AnyObject) {
self.showData.text = "\(data)"
}
非常感谢您的意见。 –
法案SenderViewController
:
当您点击按钮调用sendData
方法。在这种方法中,您可以要求delegate
调用其方法messageData
。代表属性声明为SenderViewControllerDelegate
类型,所以你可以做到这一点(见协议defenition)。
在ViewController
(第一视图控制器):
在您打开第二个视图控制器,在方法goToView
你塞汀了财产delegate
的SenderViewController
为“自己”,到ViewController
确切实例,因为你宣布,确认协议SenderViewControllerDelegate
通过实施方法messageData
。所以,ViewController
现在保存为delegate
财产SenderViewController
,并可用于调用messageData
!
有道理,非常感谢。 –
self.delegate?.messageData(inputMessage.text!)
这个调用'self.delegate?.messageData'来自'SenderViewController'中的'func sendData'正在执行它。 – iphonic
按照本教程,您将得到您的答案 - http://www.tutorialspoint.com/ios/ios_delegates.htm –
使用委托swift 4.0传递数据:https://iosdevcenters.blogspot.com/2017/11/what- is-protocol-how-to-pop-data-using.html – Bhadresh