【问题标题】:How to save data with segues in multi storyboard app?如何在多故事板应用程序中使用 segues 保存数据?
【发布时间】:2020-10-21 09:49:46
【问题描述】:

我对编码非常陌生,我正在尝试制作一个简单的应用程序。该应用程序是一种问卷调查,它会问你一个问题,你必须把答案放在 textField 中。问题是当您尝试返回上一页时,您在 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)
    }

【问题讨论】:

    标签: ios swift segue transfer


    【解决方案1】:

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

    1. PageTwoViewController

      中定义一个((String) -> Void)类型的回调变量
    2. prepare(for:, sender)中为PageViewController实例的callBack变量分配一个闭包。

      类 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)
    }
    

    【讨论】:

      【解决方案2】:

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

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

      然后您可以使用 segue/unwind segue 向前/向后传递该 Map。

      使用带有 Hashmap 的静态类可能更容易从每个视图控制器访问。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-12
        • 1970-01-01
        • 2012-04-16
        • 1970-01-01
        • 1970-01-01
        • 2012-07-26
        • 2012-01-25
        • 1970-01-01
        相关资源
        最近更新 更多