我正在练习如何使用协议和委托在两个视图控制器之间进行通信(即使在我在项目中使用协议的情况下,即使在xCode后台,我也会遇到相同的问题,委托为nil),但是设置所有内容后都会出现问题它显示我的代表为零,并且由于代表为零,因此发送方VC不发送任何数据。
我已确认该协议,并且已将接收方VC设置为代理,但仍然看不到问题出在哪里。
协议
protocol theCommunicationsStructionProtocol{
func dataToTransmit(Data: String)
}
发件人VC
class TheSenderVC{
var delegate: theCommunicationsStructionProtocol?
func lookingForDelegate(){
self.delegate?.dataToTransmit(Data: "Data has been sent")
}
}
接收方VC
class TheReceiverVc1: theCommunicationsStructionProtocol{
var TheSenderVCObj = TheSenderVC()
func delegateLuncher(){
TheSenderVCObj.delegate = self
}
func dataToTransmit(Data: String) {
print("from VC1: \(Data)")
}
}
调用proxyLuncher()在接收方VC中设置委托
TheSenderVC().lookingForDelegate()
从发送方VC调用lookingForDelegate()以查找 委托并发送数据
TheReceiverVc1().delegateLuncher()
注意:我尝试使用以下方式从接收方VC访问委托:
class TheReceiverVc1: theCommunicationsStructionProtocol{
var TheSenderVCObj: TheSenderVC?
func delegateLuncher(){
self.TheSenderVCObj?.delegate = self
}
func dataToTransmit(Data: String) {
print("from VC1: \(Data)")
}
}
但我仍然遇到相同的问题:
代表为零
答案 0 :(得分:0)
您在哪里创建 TheSenderVCObj
的引用将 var TheSenderVCObj:TheSenderVC?替换为 var TheSenderVCObj = TheSenderVC()
尝试下面的代码:
class TheReceiverVc1: theCommunicationsStructionProtocol{
var TheSenderVCObj = TheSenderVC()
func delegateLuncher(){
self.TheSenderVCObj?.delegate = self
}
func dataToTransmit(Data: String) {
print("from VC1: \(Data)")
}
}
根据您的代码,您的TheSenderVCObj也为零。
注意:使用正确的命名约定。
答案 1 :(得分:0)
最后,我找到了解决方案! 问题是我正在制作TheSenderVC的实例,而不是讨论原始的TheSenderVC。 当我制作TheSenderVC的对象(实例)时,发生了问题!相反,我必须访问原始的TheSenderVC,这意味着我必须使用static:)
这是旧的委托设置
var delegate: theCommunicationsStructionProtocol?
来自TheSenderVC
这是新的委托设置
static var delegate: theCommunicationsStructionProtocol?
因此
func lookingForDelegate(){
self.delegate?.dataToTransmit(Data: "Data has been sent")
}
将更改为
static func lookingForDelegate(){
self.delegate?.dataToTransmit(Data: "Data has been sent")
}
因为它现在包含一个静态属性(委托)
另一方面,ReceiverVC1应该更改为:
class TheReceiverVc1: theCommunicationsStructionProtocol{
var TheSenderVCObj = TheSenderVC()
func delegateLuncher(){
TheSenderVCObj.delegate = self
}
func dataToTransmit(Data: String) {
print("from VC1: \(Data)")
}
}
收件人:
class TheReceiverVc1: theCommunicationsStructionProtocol{
func delegateLuncher(){
TheSenderVC.delegate = self
}
func dataToTransmit(Data: String) {
print("from VC1: \(Data)")
}
}
从原始TheSenderVC()访问委托
答案 2 :(得分:-1)
因为TheReceiverVc1
由ARC
自动取消了初始化。
您需要像这样保存实例的引用:
class ViewController: UIViewController {
let theReceiverVc1: TheReceiverVc1 = TheReceiverVc1()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
theReceiverVc1.delegateLuncher()
}
}
还要确保在使用委托时将其设置为弱变量:
weak var delegate: theCommunicationsStructionProtocol?