如何在多故事板应用程序中使用 segues 保存数据?

How to save data with segues in multi storyboard app?

我对编码非常陌生,我正在尝试制作一个简单的应用程序。该应用程序是一种问卷,它会问你一个问题,你必须将答案放在文本字段中。问题是当您尝试返回上一页时,您在 textField 中输入的文本消失了。如果您决定更改某个问题的答案,我希望文本保留在那里。

这是第一个视图:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
        
    @IBAction func startedButtonPressed(_ sender: UIButton) {
    
    self.performSegue(withIdentifier: "goToPageTwo", sender: self)
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?)
    {
        if segue.identifier == "goToPageTwo" {
            let destinationVC = segue.destination as! PageTwoViewController

这是第二次页面浏览:

import UIKit

class PageTwoViewController: UIViewController {
    
    var textBox: String?
    @IBOutlet weak var textFieldOne: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func backButtonPressed(_ sender: UIButton) {
        self.dismiss(animated: true, completion: nil)
    }

如果问卷有多个页面,一种处理方法是使用数据结构在用户键入答案后保存所有答案,然后将它们加载到页面上的文本框(如果可用)。

您可以使用哈希图,其中键是问题编号,值是文本答案。

然后您可以使用 segue/unwind segue 沿 forward/backward 传递该地图。

将静态 class 与 Hashmap 一起使用可能更容易,以便从每个视图控制器访问。

你可以做的是,你可以为此使用 callBack 闭包:

  1. PageTwoViewController[=32= 中定义 ((String) -> Void) 类型的回调变量]

  2. prepare(for:, sender)中给PageViewController[=32=的callBack变量赋一个闭包]实例。

    class ViewController: UIViewController { 重写 func viewDidLoad() { super.viewDidLoad() } var firstAnswer:字符串? // NEW_LINE_ADDED @IBAction func startedButtonPressed(_ sender: UIButton) {

         self.performSegue(withIdentifier: "goToPageTwo", sender: self)
     }
     override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
         if segue.identifier == "goToPageTwo" {
             let destinationVC = segue.destination as! PageTwoViewController
             destinationVC.textBox = firstAnswer //NEW_LINE_ADDED
             destinationVC.callBack = { answer in //NEW_LINE_ADDED
                 self.firstAnswer = answer //NEW_LINE_ADDED
             }
         }
     }
    

    }

PageTwoViewController 中执行此操作

class PageTwoViewController: UIViewController {
var textBox: String?
var callBack: ((String)-> Void) //NEW_LINE_ADDED
@IBOutlet weak var textFieldOne: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    textfieldOne.text = textBox ?? ""   //NEW_LINE_ADDED
}

@IBAction func backButtonPressed(_ sender: UIButton) {
    callBack?(textfieldOne.text ?? "") //NEW_LINE_ADDED
    self.dismiss(animated: true, completion: nil)
}