简体   繁体   中英

Is there a way to pass data back to a view controller when swiping down to dismiss another view controller?

I have a view controller, lets call it vc1, which passes some data to another (vc2) using prepare for segue, and then calling performSegue.

Is there a way to pass some data back from vc2 to vc1 when vc2 is dismissed by swiping down?

Thanks,

Edit --

Apologies for the lack of information, very new to swift so unsure of the correct question to ask in this situation.

To elaborate, the root of the issue at the moment is that vc2 is not dismissed programatically. ie there is currently no function called, it is simply dismissed by the user swiping down.

Is there some function that I can include to capture this dismissal, and use it to send data back to vc1?

I would prefer not to add any buttons to vc2 if possible.

Apologies again, and I appreciate all the help given already!

One way yo do it is to create another file that it the controller of everything and then have a delegate that always notifies the view controllers when new changes are available. I will walk it through.

     protocol HeadControllerDelegate {
        // Create a function that sends out the data to the delegates when it is called
        // You can use your custom struct here to pass more data easly
        func didReciveNewData(myData: String?)
    }

    struct HeadController {

        // Create a shared instance so that the viewcontroller that conforms to the view as well as when we sends out the data the delegate is correct
        static var shared = HeadController()
        // Creates the delegate, every view can asign it to
        public var delegate: HeadControllerDelegate?

        // Add all your values here you want to pass back
        var myValue: String? {
            // The didSet gets called every time this value is set, and then is it time to call the delegate method
            didSet {
                // Calls the delegates didReciveMethod to notify the delegates that new data exsists
                delegate?.didReciveNewData(myData: myValue)
            }
        }
    }

Now in your viewcontroller class where you would like the data to be avaiable (as you said when you swipe down)

    class ViewController: UIViewController {

    // Here you create a property of the shared instance
    let headController = HeadController.shared

    override func viewDidLoad() {
        super.viewDidLoad()

        // Set yourself as the delegate for the headController delegate to recive data
        headController.delegate = self

    }

}

extension ViewController: HeadControllerDelegate {

    // here will the data be recived
    func didReciveNewData(myData: String?) {
        // handle the data here, you have now got newData

        print(myData)
    }
}

In the class where you want to pass data you just do it like this. The beauty of this is that you can have multiple classes or structs that writes to the head controllers data (just make sure you do it thought the shared instance). It is also a good pracice according to we to use the delegate pattern.

class Sender {

    var headController = HeadController.shared

    func sendData(data: String) {

        // Here you change the data of the headcontroller wich will send the data to all the delegates
        headController.myValue = data
    }
}

Hope this answer helps. If you have any questions please let me know.

UPDATE -- EASIER SOLUTION

Here is an easier solution but is less scalable as the previous one according to me.

In prepareForSegue simply pass over your current viewContorller as a field in the destination view controller. Then when viewDidDissapear in the new view controller you can simply pass back the data. Not to worry, I will show you!

In prepare for Segue

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let dc = segue.destination as? SecondViewController {
        dc.viewController = self
    }
}

And declare the secondViewContorller as following. The ViewDidDisappear method will be called when the view has dismissed, and therefore can you pass over the data to the view controller you have set before using the prepare for segue method.

    class SecondViewController: UIViewController {

    var viewController: UIViewController?

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewDidDisappear(_ animated: Bool) {
        (viewController as? ViewController)?.value = 2
    }

}

Then you could update the UI using a didSet, which simply will be called when the property is set, which will be done in the view did disappear method.

var value: Int = 0 {
    didSet {
        print(value)
        text?.text = "\(value)"
    }
}

Hope this helps!

Try This

class VCOne: UIViewController {

//Create a shared instance of VCOne

 static var sharedInstance:VCOne?

 //Let the data to be passed back to VCOne is of type string

  var dataToBePassedBack:String?

  override func viewDidLoad() {
    super.viewDidLoad()

   //set the sharedInstance to self
    VCOne.sharedInstance = self

    }

}

Class VCTwo:UIViewController{

 //function in which you are dismissing your current VC you can use the shared 
 instance to pass the data back

func dismissVC(){

  //before dismissing the VCTwo you can set the value for VCOne

VCOne.sharedInstance?.dataToBePassedBack = "data" 

}


}
  • Using Protocol And Delegate You Do or Other Option is NSotificationcenter .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM