Search code examples
iosswiftuinavigationcontrollersegue

How can I send data back to the first view controller after detecting that the back button was pressed?


Now Using the Delegate Pattern to transfer the data:

I have implemented this function:

 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)
    }
}

And here i the setValues from the protocol I wrote:

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

However after printing one of the properties of the object, the data has not been transferred.


Solution

  • You can use Delegate pattern or use Observer. See these examples for help.

    Edit: using delegate based on your code

    Protocol

    protocol SetValueDelegate {
        func didFinishSetValue(obj: Overview)
    }
    

    First view controller

    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
       }
    
    }
    

    Second view controller

    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)
          }
       }
    
    }