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!
I replicated your query and created 3 View Controllers: VC1, VC2 and VC3. I achieve this using Delegates and Segues. The Storyboard Setup .
VC1.Swift:
class VC1: UIViewController, VC2Delegate {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
func showVC3() {
self.performSegueWithIdentifier("VC1ToVC3", sender: nil)
}
// MARK: - Navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "VC1ToVC2" {
if let destVC = segue.destinationViewController as? VC2 {
destVC.delegate = self
}
}
}
}
VC2.Swift:
protocol VC2Delegate {
func showVC3()
}
class VC2: UIViewController {
var delegate:VC2Delegate?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func actBack(){
self.dismissViewControllerAnimated(true, completion: nil)
if let _ = delegate {
delegate?.showVC3()
}
}
}
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:
import UIKit
class ViewController: UIViewController, presentViewControllerThree{
@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)
}
}
import UIKit
protocol presentViewControllerThree {
func presentVC3()
}
class ViewController2: UIViewController {
var delegate: presentViewControllerThree?
@IBAction func dismissViewControllerOnClick(_ sender: AnyObject) {
self.dismiss(animated: true, completion: nil)
delegate?.presentVC3()
}
}
import UIKit
class ViewController3: UIViewController {
@IBAction func dismissViewControllerOnClick(_ sender: AnyObject) {
self.dismiss(animated: true, completion: nil)
}
}
Please check my GitHub link to test sample project:
https://github.com/k-sathireddy/DismissPresentViewControllers
The error message is quite descriptive:
Attempt to present ViewController3 on ViewController2 whose view is not in the window hierarchy!
Lets take a look at your existing code:
self.dismissViewControllerAnimated(false, completion: {
self.VC3 = (mainStoryboard.instantiateViewControllerWithIdentifier("ViewController3") as! ViewController3)
//Using self here is causing that error
self.presentViewController(self.VC3!, animated: true, completion: nil)
})
In the completion handler, you are trying to present VC3
from self
...but self
refers to the ViewController
you just dismissed. Thats what that error message is telling you.
Instead, you need to present VC3 from the parent of VC2 . One way you can achieve that is through the presentingViewController
property:
self.dismissViewControllerAnimated(false, completion: {
self.VC3 = (mainStoryboard.instantiateViewControllerWithIdentifier("ViewController3") as! ViewController3)
self.presentingViewController.presentViewController(self.VC3!, animated: true, completion: nil)
})
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.