iNishinKareem iNishinKareem - 2 months ago 9
iOS Question

Dismissing a View Controller and displaying another View Controller


  • I've got three ViewControllers - V1 V2 and V3.

  • A button click on V1, ViewController V2 is displayed with animation
    FlipHorizontal.

  • Now on a button click from V2, ViewController should be dismissed
    back to V1 and display ViewController V3.

    I tried this piece of code to achieve this functionality. It's not working though. Please help!



Note : V2 and V3 are in same StoryBoard (Start). V1 is in different story board(main).

var VC3 : ViewController3?

let mainStoryboard: UIStoryboard = UIStoryboard(name: "start",bundle: nil)

self.dismissViewControllerAnimated(false, completion: {
self.VC3 = (mainStoryboard.instantiateViewControllerWithIdentifier("ViewController3") as! ViewController3)
self.presentViewController(self.VC3!, animated: true, completion: nil)
})


Update- I get this warning
Attempt to present ViewController3 on ViewController2 whose view is not in the window hierarchy!

Answer

The warning states that "You are presenting ViewController3 on ViewController2, But ViewController2 is not there in the view hierarchy!". This means ViewController2 has dismissed before ViewController3 would be presented. So it is not possible to present ViewController 3 on ViewController2

Use this sample code:

ViewController1

import UIKit

class ViewController: UIViewController, presentViewControllerThree{

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func displayViewControllerTwoOnClick(_ sender: AnyObject) {
        let currentStoryboard: UIStoryboard = UIStoryboard(name: "Start",bundle: nil)
        let  vc2: ViewController2 = currentStoryboard.instantiateViewController(withIdentifier: "viewcont2") as! ViewController2
        vc2.delegate = self
        self.navigationController?.present(vc2, animated: true, completion: nil)
    }

    func presentVC3(){
        let currentStoryboard: UIStoryboard = UIStoryboard(name: "Start",bundle: nil)
        let  vc3: ViewController3 = currentStoryboard.instantiateViewController(withIdentifier: "viewcont3") as! ViewController3

         self.navigationController?.present(vc3, animated: true, completion: nil)
    }

}

ViewController2

 import UIKit

protocol presentViewControllerThree {
    func presentVC3()
}

class ViewController2: UIViewController {

    var delegate: presentViewControllerThree?

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func dismissViewControllerOnClick(_ sender: AnyObject) {

        self.dismiss(animated: true, completion: nil)
        delegate?.presentVC3()

    }

}

ViewController3

   import UIKit

class ViewController3: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func dismissViewControllerOnClick(_ sender: AnyObject) {

        self.dismiss(animated: true, completion: nil)
    }


}

Main.storyboard screenshot:

enter image description here

Start.storyboard:

enter image description here

Please check my GitHub link to test sample project:

https://github.com/k-sathireddy/DismissPresentViewControllers

Comments