切换视图后数据丢失

Data is lost after switching views

在屏幕 A 中,我从用户那里收集数据,然后使用 prepare for segue 功能将其显示在屏幕 B 上。然后我注意到如果用户转到屏幕 C 然后返回屏幕 B,数据就消失了。我如何将数据保存在那里。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var textInput: UITextField!

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let a : BViewController = segue.destination as! BViewController
        a.honey = textInput.text!
    }
}

import UIKit

class BViewController: UIViewController {

    @IBOutlet weak var x: UILabel!

    var honey:String = "default"
    override func viewDidLoad() {
        super.viewDidLoad()
        x.text = honey
    }
}

Then I noticed if the user goes to Screen C and then back to Screen B the data is gone. How do I keep the data there.

我看到两个问题:

  1. 看起来你实际上并没有回到你离开的"screen B"。故事板显示了从 B 到 C 的推送转场,以及从 C 到 B 的另一个推送转场。所以我认为正在发生的事情是您正在创建 另一个 屏幕 B,与第一个屏幕分开。您应该查看 unwinding the push segue 而不是添加另一个。请记住:您在情节提要中创建的屏幕不是单个对象 -- 它们更像是对象的模式或原型,并且可以多次实例化。

  2. 更一般地说,避免将程序的数据存储在视图甚至视图控制器中是个好主意。 MVC中的M代表model,意思是作为一个单独的对象(或对象组)管理数据和业务逻辑你的应用程序。使用模型不能解决问题 #1,但它仍然可以帮助您避免很多 "hey, where did my data go?" 问题。

这是一个常见问题。
您需要在实例化时将数据传递到每个新的 VC 中。你要保存的数据可以是每个VC.

中的一个实例变量

或者你需要将你想要持久化的数据保存到NSUserDefaults或者使用Core Data。如果你走这条路,一旦你将数据保存到这些地方之一,你就可以随时随地访问它。