首页 > 解决方案 > 在不移动 ViewController 的情况下将数据推送到另一个 ViewController

问题描述

我对 Swift 编码比较陌生。我正在尝试将数据传递回另一个视图控制器,而不必转到该控制器,以便用户可以留在同一屏幕上。我正在研究使用委托,并想知道这是否是在多个视图控制器上访问变量的最佳方式。谢谢

视图控制器 1:

func passVariables() {


    let passSleepValue = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "sbHome") as! sbHomeController
    passSleepValue.getSleepValue = sleepValue




    //navigationController?.pushViewController(passSleepValue, animated: true)


}

视图控制器 2:

    func updateDay() {






    let dayScoreAvg = getSleepValue

    dayScore.text = String(format: "%.1f", dayScoreAvg)

    print("Get sleep Value is \(getSleepValue)")

}

标签: iosswiftxcodevariables

解决方案


看起来您已经可以将数据传递给第二个 ViewController,但您不能将一些数据传回。

所以一种方法是使用委托模式

从使用传递数据的方法声明委托协议开始(在您的情况下,它可以只是传递String

protocol SecondVCDelegate: class {
    func passText(_ text: String)
}

delegate然后在第二个 ViewController 中创建变量

class SecondViewController: UIViewController {
    weak var delegate: SecondVCDelegate?
    ...
}

现在您可以将此协议实现到第一个 ViewController

extension ViewController: SecondVCDelegate {
    func passText(_text: String) {
        // do something with text passed from second VC
    }
}

现在设置delegateSecond VC,就像self你推它之前一样

func passVariables() {

    let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "sbHome") as! sbHomeController
    viewController.getSleepValue = sleepValue
    viewController.delegate = self
    navigationController?.pushViewController(viewController, animated: true)

}

然后在第二个VC中你可以调用你的方法delegate,在第一个VC中这个方法被调用

delegate?.passText("Hello First!")

推荐阅读