代表在Swift程序中为零

时间:2019-07-14 10:59:15

标签: ios swift delegates protocols

我正在练习如何使用协议和委托在两个视图控制器之间进行通信(即使在我在项目中使用协议的情况下,即使在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)")
 }

}  

但我仍然遇到相同的问题:

  

代表为零

3 个答案:

答案 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)

因为TheReceiverVc1ARC自动取消了初始化。 您需要像这样保存实例的引用:

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?