简体   繁体   中英

How to present view controller behind another view controller?

I am trying to present two view controllers. I'm trying to avoid presenting one after the other as this doesn't give a good user experience.

I'm using storyboards / segues to present the view controllers, each embedded in navigation controllers.

The behaviour should be:

View Controller 1 presents view controller 2 - but when view controller 2 dismisses I'd like view controller 3 to be the one showing to the user. And ideally an ability to also dismiss to view controller 1.

I understand I can accomplish this with child views. But I'd ideally like to learn how it can be done by manipulating the navigation stack.

I don't think you can do what you want with segue , but certainly you can do it with a little code...

This will (on a button tap, for example) perform a standard slide-in navigation controller animation directly from the current ViewController (call it vc1 ) to ViewController2 , but "insert" ViewController3 into the stack. Tapping the Back button will take you from vc2 to vc3 to vc1 .

@IBAction func didTap(_ sender: Any) {

    guard let vc3 = storyboard?.instantiateViewController(withIdentifier: "vc3"),
        let vc2 = storyboard?.instantiateViewController(withIdentifier: "vc2")
        else { return }

    let vcArray = [self, vc3, vc2]

    self.navigationController?.setViewControllers(vcArray, animated: true)

}

If you want to go from vc2 back to vc1 and "skip over" vc3 , in vc2 add (on a button tap, for example):

@IBAction func backToStartTap(_ sender: Any) {

    self.navigationController?.popToRootViewController(animated: true)

}

As best to my understanding about your question, try out below method:

Present VC 3 from VC 1 and from VC 3 present VC 2 immediately(This can be done by putting the viewController present code in the ViewDidLoad() of VC 3).

So when you dismiss VC 2, VC 3 will be shown and on dismissing VC 3 , you will be redirected to VC 1.

VC means ViewController.

Presenting viewController in the ViewDidLoad() is really a bad idea.

You can present VC3 and add VC1.view and VC2.view as a subview of VC3's view and later you can remove VC1.view and VC2.view as you want and behaviour will be same as you are expecting.

您需要将要显示的.modalPresentationStyle设置为.currentContext,并将当前的viewcontroller .definesPresentationContext设置为false。

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