繁体   English   中英

Delegate 在 Swift 程序中为零

[英]Delegate is nil in a Swift program

我正在练习如何使用协议和委托在两个视图控制器之间进行通信(在 xCode 背景中,即使我在我的项目中使用协议,我也遇到了同样的问题,委托为零),但是设置所有内容后的问题显示给我我的委托为零,发送方 VC 不发送任何数据,因为委托为零。

我已经确认了协议并将接收方VC设置为delegate,但仍然看不出问题在哪里。

议定书

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)")
 }

}

调用 delegateLuncher() 在接收方 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)")
 }

}  

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

代表为零

终于,我找到了解决方案! 问题是我正在制作 TheSenderVC 的实例,而不是处理原始的 TheSenderVC。 当我制作 TheSenderVC 的对象(一个实例)时,问题发生了! 相反,我必须访问原始的 TheSenderVC,这意味着我必须使用静态 :)

这是旧的代表设置

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() 访问委托

你在哪里创建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 也为零。

注意:使用正确的命名约定。

因为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?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM