Мой вопрос немного запутан. У меня есть ViewController, который показывает пользователю некоторые атрибуты, эти атрибуты находятся в словаре. Для редактирования этих атрибутов у меня есть другой ViewController, который, когда я «перехожу» к нему, я передаю атрибуты по умолчанию, например:
viewController.value = self.value
На втором ViewController (контроллер представления выпуска) у меня есть варианты «Вернуться к 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





Когда вы назначаете SaleOrder второму контроллеру представления, вы передаете ссылку на SaleOrder вместо копии.
Это означает, что всякий раз, когда вы обновляете SaleOrder на втором экране, вы обновляете тот же SaleOrder, который использовался на первом.
Я думаю, что просто изменив его на let вместо var на первом экране, можно исправить. Вы также можете попробовать передать копию объекта вместо ссылки с помощью saleOrder! .Copy (), хотя я думаю, что ваш класс SaleOrder должен соответствовать протоколу NSCopying.
Если вы хотите узнать больше о ссылочных типах, вы можете прочитать эту тему Быстрая передача по значению или передача по ссылке
Я не знал, что это делает Свифт. Спасибо.