在检测到按下后退按钮后如何将数据发送回第一个视图控制器?

时间:2019-03-18 23:58:46

标签: ios swift uinavigationcontroller segue

现在使用委托模式来传输数据:

我已经实现了此功能:

 var overviewController = addOverview()

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

func setValues(){
    overview.name = buildingName.text!
    overview.city = city.text!
    overview.contact = contactName.text!
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "MM-dd-yyyy"
    overview.date = dateFormatter.string(from: datePicker.date)
    overview.email = email.text!
    overview.building = buildingTypes[buildingPicker.selectedRow(inComponent: 0)]
    overview.freq = cleaningFreqs[cleaningFreqPicker.selectedRow(inComponent: 0)]
    overview.phone = phoneNumber.text!
    overview.sft = sqFt.text!
    overview.state = State.text!
    overview.street = street.text!
}



// MARK: - Navigation

override func willMove(toParent parent: UIViewController?) {
    super.willMove(toParent:parent)
    if parent == nil {
        setValues()
        print("Hello")
        delegate?.setValues(obj: overview)
    }
}

在这里,我是我编写的协议中的setValues:

func setValues(obj: overviewProps){
    overview = obj
}

但是,在打印对象的一种属性后,数据尚未传输。

3 个答案:

答案 0 :(得分:1)

有两种方法可以在两个viewController之间传递/交换数据。我不知道您的执行情况如何。但是您可以使用委托模式来实现目标。要传递数据时,请使用委托并触发方法。

正如我所说,还有其他解决方案。但这取决于您,您要选择哪一个。

答案 1 :(得分:0)

您可以使用委托模式或使用观察者。请参阅这些示例以获取帮助。

编辑:根据您的代码使用委托

协议

protocol SetValueDelegate {
    func didFinishSetValue(obj: Overview)
}

第一视图控制器

class FirstViewController: UIViewController, SetValueDelegate {

   var secondViewController = SecondViewContrller()

   override func viewDidLoad() {
       super.viewDidLoad()
       secondViewController?.delegate = self
   }

   func didFinishSetValue(obj: Overview) {
       // when it comes back to the first screen you can use ->> obj data
   }

}

第二个视图控制器

class SecondViewController: UIViewController {
   var delegate: SetValueDelegate?

   override func viewDidLoad() {
       super.viewDidLoad()
       …
   }
   override func willMove(toParent parent: UIViewController?) {
      super.willMove(toParent: parent)
      if parent == nil {
         setValues()
         …
         self.delegate?.didFinishSetValue(obj: overview)
      }
   }

}

答案 2 :(得分:0)

使用导航设计在当前视图和根视图之间传递数据的正确方法是触发展开序列。

看看以下文章。它在Swift 3中,但是应该为您将它翻译成Swift 4.2提供一个良好的开端。

https://link.medium.com/b4eFIx7LaV

相关问题