首页 > 解决方案 > Xcode Swift 委托,新值在 VC 实例化时被覆盖

问题描述

我有一个关于 swift 授权的小问题。我正在尝试将文本从 ViewController 发送到 SecondViewController。加载第二个屏幕时,它仍然显示“旧文本”而不​​是“新文本”,这是我的代码。当视图控制器加载不确定为什么这是我的代码时,会发生“textReceived”变量的值再次被旧文本覆盖:

protocol DataTransferTestProtocol {
    func receiveTextFromVC1(_ text: String)
}

class ViewController: UIViewController {

    var delegate: DataTransferTestProtocol?

    override func viewDidLoad() {
        super.viewDidLoad()

        let receivingVC = SecondViewController()
        self.delegate = receivingVC
    }

    @IBAction func buttonTapped(_ sender: Any) {
        delegate?.receiveTextFromVC1("NEW TEXT")
    }
}


class SecondViewController: UIViewController, DataTransferTestProtocol {

    @IBOutlet weak var myLabel: UILabel!

    var textReceived = "OLD TEXT"

    func receiveTextFromVC1(_ text: String) {
        textReceived = text
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        myLabel.text = textReceived
    }
}

标签: iosswiftxcode

解决方案


问题是这一行:

    let receivingVC = SecondViewController()

您想与您可能在屏幕上看到的 SecondViewController 实例交谈。但取而代之的是,您正在制作另一个您永远不会在屏幕上看到的SecondViewController 。因此,您发送给委托人的更改将永远不可见。(您可能想阅读我的文章,http://www.programmingios.net/dont-make-a-new-instance-by-mistake/。)

另一个问题是您是否应该在这里使用委托。委托通常用于从第二个视图控制器与第一个视图控制器进行通信。向前通信要简单得多:第一个视图控制器知道第二个视图控制器的所有信息,并且直接与它通信。(如果您要解释这些视图控制器是什么以及它们在全导入视图控制器层次结构中如何相互关联,我们可以更具体地说明这一点。)


推荐阅读