[英]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.