如何在检测到按下后退按钮后将数据发送回第一个视图控制器?
How can I send data back to the first view controller after detecting that the back button was pressed?
现在使用委托模式传输数据:
我实现了这个功能:
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
}
然而打印对象的其中一个属性后,数据还没有传输。
有很多方法可以在两个视图控制器之间 pass/exchange 数据。我不知道您的实施方式如何。但是您可以使用委托模式来实现您的目标。当您想要传递数据时,使用委托并触发方法。
正如我所说,还有其他解决方案。但这取决于你,你想选择哪一个。
您可以使用委托模式或使用观察者模式。请参阅这些示例以获取帮助。
- 代表:https://www.appcoda.com/swift-delegate/
- 观察者:NSNotificationCenter addObserver in Swift
编辑:根据您的代码使用委托
协议
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)
}
}
}
使用导航设计在当前视图和根视图之间传递数据的正确方法是触发展开转场。
看看下面的文章。它在 Swift 3 中,但它应该为您将其转换为 Swift 4.2
提供一个良好的开端
现在使用委托模式传输数据:
我实现了这个功能:
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
}
然而打印对象的其中一个属性后,数据还没有传输。
有很多方法可以在两个视图控制器之间 pass/exchange 数据。我不知道您的实施方式如何。但是您可以使用委托模式来实现您的目标。当您想要传递数据时,使用委托并触发方法。
正如我所说,还有其他解决方案。但这取决于你,你想选择哪一个。
您可以使用委托模式或使用观察者模式。请参阅这些示例以获取帮助。
- 代表:https://www.appcoda.com/swift-delegate/
- 观察者:NSNotificationCenter addObserver in Swift
编辑:根据您的代码使用委托
协议
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)
}
}
}
使用导航设计在当前视图和根视图之间传递数据的正确方法是触发展开转场。
看看下面的文章。它在 Swift 3 中,但它应该为您将其转换为 Swift 4.2
提供一个良好的开端