传递参数时,正向ViewController会更改ViewController的变量值

时间:2018-08-09 14:05:56

标签: ios swift uiviewcontroller

我的问题有点困惑。 我有一个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

enter image description here

enter image description here

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

当您将SaleOrder分配给第二个视图控制器时,您将传递对SaleOrder的引用而不是副本。

这意味着,每当在第二个屏幕上更新SaleOrder时,您都在更新第一个屏幕上使用的相同SaleOrder。

我认为只需在第一屏幕中将其更改为let而不是var即可解决。 您也可以尝试传递对象的副本,而不是使用saleOrder!.copy()进行引用,尽管我认为您的SaleOrder类将需要符合NSCopying协议。

如果您想了解有关引用类型的更多信息,可以阅读本主题Is Swift Pass By Value or Pass By Reference