在 iOS Swift 中的视图之间保存模型中的数据

Save data in Model between Views in iOS Swift

我是 iOS 开发的新手,我对如何在访问多个视图时将数据保存到模型中感到困惑..

我有一个披萨 select 或者(为了这个例子我将简化模型),我的根文件有 2 个按钮标签:"Size","Dough",每次你按下一个按钮,你就会在一个节目中导航到一个新的 ViewController,在这里你有一个从 3 种尺寸或面团中选择 select 的选择器。

我不能做的是在从另一个视图返回时保存其中一个视图的数据,我的意思是,如果您按大小按钮和 select 例如 "large" 当你点击接受它 returns 到 ViewController class 并且我有 "large" 的值但是现在如果你按下 "Dough" 按钮和 select "thin" 当你回来时它只有 "thin" 值,以前的尺寸值丢失了...

这是ViewController(根文件):

class ViewController: UIViewController {

    let pizza = Pizza(tamano: "", masa: "")

    enum Constantes {
        case Tamano
        case Masa
    }

    @IBOutlet weak var tamanoLabel: UIButton!
    // Almacenamos el tamaño de la pizza
    var tamanoPvara:String?
    var tipoMasa:String?

    // Almacenamos cuales tipos/ingredientes aun no tengo
    var compruebaEleccion = [Constantes.Tamano:false]


    override func viewDidLoad() {
        super.viewDidLoad()
        print("tamano: \(pizza.tamano) masa: \(pizza.masa)")
        // Do any additional setup after loading the view, typically from a nib.
        //        if let (pizza.model["Tamano"] != "") {
        //            labelTamanoPizza.text = pizza.model["Tamano"]
        //        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func btnConfirmacion(sender: AnyObject) {
        // Variable para saber si estan todos los pasos hechos
        print("tamano: \(pizza.tamano) masa: \(pizza.masa)")

    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if (segue.identifier == "tamanoPizza") {
            print("tamaño")
            let destinationViewController = segue.destinationViewController as! ViewTamanoController
            destinationViewController.pizza = self.pizza
        }
        if (segue.identifier == "TipoMasa") {
            print("masa")
            let destinationViewController = segue.destinationViewController as! ViewTipoMasaController
            destinationViewController.pizza = self.pizza
        }
    }


}

这是 ViewSizeController:

class ViewTamanoController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate {


    @IBOutlet weak var tamanoSelector: UIPickerView!
    @IBOutlet weak var labelTamano: UILabel!

    let pickerData = ["Chica","Mediana","Grande"]

    var pizza = Pizza?()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        tamanoSelector.dataSource = self
        tamanoSelector.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return pickerData.count
    }

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return pickerData[row]
    }

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        labelTamano.text = pickerData[row]
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if (segue.identifier == "fromTamanoToController") {
            print("segue tamaño")
            let viewController = segue.destinationViewController as! ViewController
//            viewController.tamanoPizza = labelTamano.text;
            viewController.pizza.tamano = labelTamano.text
        }
    }

    @IBAction func btnAceptar(sender: AnyObject) {
//        print("aceptar tamaño")

        pizza!.tamano = labelTamano.text
         print(pizza!.tamano)
    }
}

这是 ViewDoughController

class ViewTipoMasaController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate  {

    @IBOutlet weak var tipoMasaLabel: UILabel!
    @IBOutlet weak var tipoMasaSelector: UIPickerView!

    let pickerData = ["Delgada","Crujiente","Gruesa"]

    var pizza = Pizza?()


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        tipoMasaSelector.dataSource = self
        tipoMasaSelector.delegate = self

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return pickerData.count
    }

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return pickerData[row]
    }

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        tipoMasaLabel.text = pickerData[row]
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if (segue.identifier == "fromTipoMasaToController") {
            let viewController = segue.destinationViewController as! ViewController
//            viewController.tipoMasa = tipoMasaLabel.text;
            viewController.pizza.masa = tipoMasaLabel.text
        }
    }

    @IBAction func btnAceptar(sender: AnyObject) {

        pizza?.masa = tipoMasaLabel.text
        print(pizza!.masa)
    }

}

我知道这是一个简单的问题,但我们将不胜感激

非常感谢

原因是根视图控制器在每次加载时都重新加载 let pizza = Pizza(tamano: "", masa: "") 的新实例。

从根视图控制器中获取 let pizza = Pizza(tamano: "", masa: "") 行或从 class 实例中获取它。

我想我发现了你的问题。在详细信息 ViewController 中,您正在执行新的 segue,这意味着您每次都在创建一个新的父级 ViewController。你要做的是 dismiss detail View Controller。您不需要详细信息 ViewController 中的方法 prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)

你的 btnAceptar 函数应该是这样的:

@IBAction func btnAceptar(sender: AnyObject) {

        pizza?.masa = tipoMasaLabel.text
        print(pizza!.masa)
        self.dismissViewControllerAnimated(true, completion: nil)
    }

使用 dismissViewController 你实际上是返回到第一个父 View Controller,而不是新的。

现在,您必须向父级 ViewController 传递面团的值和大小,但您无法像您尝试的那样轻松地做到这一点。你必须这样做的方式:通知或代表。你在这里有一个简单的例子: Pass data when dismiss modal viewController in swift

您必须使用方法 "setDough" 和 "setSize" 来代替方法 "backFromCamera"。

玩得开心 ;)