提问者:小点点

协议委托未按预期传递数据[Swift5]


我已经创建了一个简单的协议委托来将数据从一个视图控制器传递到第二个视图控制器--但是数据似乎没有传递出去?

详细信息:第一个视图控制器有一个textField,我在其中键入数据(字符串),以传递给第二个VC。我也有一个按钮的动作触发过渡到第二视图控制器。第二个视图控制器出现,但来自第一个视图控制器的数据没有显示出来-预期的行为是第二个VC中的标签用来自第一个VC的数据更新。我还创建了一个从FVC到SVC的segue按钮,其标识符为'send dataidentifier'。

我做错了什么?

下面的代码和截图:

第一视图控制器

import UIKit

protocol SendDataDelegte {
    func sendData(data: String)
}

class FirstViewController: UIViewController {

    var delegate: SendDataDelegte? = nil

    @IBOutlet weak var dataCaptured: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func sendDataButton(_ sender: Any) {
        let dataToBeSent = self.dataCaptured.text
        self.delegate?.sendData(data: dataToBeSent!)
    }
}

第二视图控制器

import UIKit

class SecondViewController: UIViewController, SendDataDelegte {

    @IBOutlet weak var dataRetrived: UILabel!
    @IBAction func closeButton(_ sender: Any) {
         dismiss(animated: true, completion: nil)
    }

    func sendData(data: String) {
        self.dataRetrived.text = data
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "sendDataIdentifier" {
            let firstVC: FirstViewController = segue.destination as! FirstViewController
            firstVC.delegate = self
        }
    }
}


共1个答案

匿名用户

你搞错了方向。

在此实例中不需要委托模式。您需要在第一个视图控制器中实现prepare(for segue)并将数据传递到目标视图控制器。

在目标视图控制器中未调用prepare(for segue),并且在第一个视图控制器中,delegate属性将为nil,因为没有设置它。

class FirstViewController: UIViewController {

    @IBOutlet weak var dataCaptured: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let dest = segue.destination as? SecondViewController {
            dest.text = self.dataCaptured.text
        }
    }
}

class SecondViewController: UIViewController, SendDataDelegte {

    @IBOutlet weak var dataRetrived: UILabel!
    var text: String?
    @IBAction func closeButton(_ sender: Any) {
         dismiss(animated: true, completion: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewWillAppear(_ animated:Bool) {
        super.viewWillAppear(animated)
        self.dataRetrieved.text = text
    }
}