为什么这个代码在控制器之间传递数据不起作用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么这个代码在控制器之间传递数据不起作用?相关的知识,希望对你有一定的参考价值。

我正在尝试理解代表,所以我创建了这个简单的应用程序来测试它,我只是想从secondViewController传递一个字符串到MainViewController ...我试图遵循所有的步骤,但似乎有一些东西缺失,我不喜欢我不知道它可能是什么......这是我的代码......

主视图控制器

class mainController: UIViewController, sendDataDelegate {

    let label: UILabel = {
        let lab = UILabel()
        lab.text = "No data"
        lab.textAlignment = .center
        lab.translatesAutoresizingMaskIntoConstraints = false
        return lab
    }()

    let tapRecognizer = UITapGestureRecognizer()
    let secondVC = SecondViewController()


    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.green


        //  assign delegate to self, not working...
        secondVC.delegate = self


        tapRecognizer.addTarget(self, action: #selector(goToSecondVC))
        view.addGestureRecognizer(tapRecognizer)
        view.addSubview(label)

        // label constraints..
        view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":label]))
        view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-200-[v0]", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":label]))
    }

    @objc func goToSecondVC(){
           show(SecondViewController(), sender: nil)
    }

    func passData(str: String) {
        print(str)
        label.text = str

    }

}

和第二个视图控制器加协议发送数据...

import UIKit


//protocol to pass the data..

protocol sendDataDelegate {
    func passData(str: String)
}



class SecondViewController: UIViewController {

    let tapRecog = UITapGestureRecognizer()

    let dataStr = "data passed"


    var delegate: sendDataDelegate?



    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = UIColor.red
        tapRecog.addTarget(self, action: #selector(goBack))
        view.addGestureRecognizer(tapRecog)

    }

    @objc func goBack(){

//        trying to pass data here..
        delegate?.passData(str: dataStr)

//        dismiss view...
        dismiss(animated: true, completion: nil)

    }

}

我想指出我正在尝试通过代码学习所有东西,所以这里没有使用故事板......我怎么能通过代码来做到这一点?

谢谢大家的答案!祝你有美好的一天)

答案

在您的函数goToSecondVC中,您将创建一个全新的视图控制器并忽略您创建的属性。

将其更改为使用secondVC而不是SecondViewController()

另一答案

此更正将解决您的问题:

@objc func goToSecondVC(){
    show(secondVC, sender: nil)
}

最好用大写字母命名协议:

 protocol SendDataDelegate: AnyObject {
     func passData(str: String)
 }

不要忘记弱代表:

weak var delegate: SendDataDelegate?
另一答案

改变goToSecondVC()方法如下:

 @objc func goToSecondVC(){
        let vc = SecondViewController()
        vc.delegate = self
        show(vc, sender: nil)
 }

以上是关于为什么这个代码在控制器之间传递数据不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在视图控制器之间传递数据 - 不起作用

在视图控制器之间传递数据 - Storyboards segues

在 VC 之间快速传递数据

为啥这个方向代码不起作用?

在模块之间传递变量[重复]

IOS Segue 在自定义标签栏中不起作用