在 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"。
玩得开心 ;)
我是 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"。
玩得开心 ;)