我的问题有点困惑。 我有一个ViewController,向用户显示一些属性,这些属性在字典中。为了编辑这些属性,我有另一个ViewController,当我“选择”该属性时,我会以默认方式传递属性,如下所示:
viewController.value = self.value
在第二个ViewController(版本的View Controller)上,我可以选择“ Back to ViewController”并保存更改,因此,我可以更改值而无需保存或保存。当我更改值而不保存时,只需回到视图控制器,就可以在以前的视图控制器中更改该值。我不明白这是怎么发生的。我将尝试显示图像。
我的第一个视图控制器是:ViewContollerSale.swift
我的第二个(编辑)视图控制器是:ViewControllerCreateSale.swift
ViewControllerSale.swift
var saleOrder : SaleOrder? // at this point it's populated
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
print("===> VcSale: prepare")
if segue.identifier == "segueEditOrder" {
print("segue: segueEditOrder")
let editVc = segue.destination as! ViewControllerCreateSale
editVc.saleToEdit = true
if saleOrder != nil {
editVc.sale = saleOrder!
}
}
}
ViewControllerCreateSale.swift
设定值的功能如下所示。但是我认为这只会更改ViewControllerCreateSale.swift实例上下文的值,但是当我后退视图控制器时,该值也会在以前的视图控制器上更改!
var sale: SaleOrder = SaleOrder()
case Notification.Name.opEntrega:
aux = notf.object as! String
sale.attributes["delivery_term_id"] = aux == "CIF" ? Int32(1) : Int32(2)
let cell = tableOptionsSelect.cellForRow(at: IndexPath(row: 3, section: 0)) as! CellSelectionCreateSale
cell.lblOptionSelect.text = aux
break
答案 0 :(得分:1)
当您将SaleOrder分配给第二个视图控制器时,您将传递对SaleOrder的引用而不是副本。
这意味着,每当在第二个屏幕上更新SaleOrder时,您都在更新第一个屏幕上使用的相同SaleOrder。
我认为只需在第一屏幕中将其更改为let而不是var即可解决。 您也可以尝试传递对象的副本,而不是使用saleOrder!.copy()进行引用,尽管我认为您的SaleOrder类将需要符合NSCopying协议。
如果您想了解有关引用类型的更多信息,可以阅读本主题Is Swift Pass By Value or Pass By Reference