Dismiss and Present View Controller in Swift

前端 未结 5 657
生来不讨喜
生来不讨喜 2020-12-09 11:52

Hi I\'m trying to present a viewcontroller and dismiss my current modal view but this code is not working

self.dismissViewControllerAnimated(true, completion         


        
相关标签:
5条回答
  • 2020-12-09 12:10

    I think there is a mistake in your code where 'self' should be the presenting view controller to present 'vc', not 'vc' its self

    Your code

    self.dismissViewControllerAnimated(true, completion: {
                    let vc = self.storyboard?.instantiateViewControllerWithIdentifier("OrderViewController")
                    vc!.presentViewController(vc!, animated: true, completion: nil)
                })
    

    Try this

    self.dismissViewControllerAnimated(true, completion: {
                    let vc = self.storyboard?.instantiateViewControllerWithIdentifier("OrderViewController")
                    self.presentViewController(vc!, animated: true, completion: nil)
                })
    

    hope this is helpful

    0 讨论(0)
  • 2020-12-09 12:21

    Here's a solution for Swift3

    To present the ViewController

    let NotificationVC = self.storyboard?.instantiateViewController(withIdentifier: "NotificationVC") as! ExecutiveNotificationViewController
    
    self.present(NotificationVC, animated: true, completion: nil)
    

    To dismiss the ViewController:

    self.dismiss(animated: true, completion: nil)
    
    0 讨论(0)
  • 2020-12-09 12:25

    You have to get the viewController which presented self (current ViewController). If that view controller is rootViewController, then you can use the code below, if not then query it based on your view controller hierarchy.

    if let vc3 = self.storyboard?.instantiateViewController(withIdentifier: "vc3") as? ViewController3 {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.window?.rootViewController!.present(vc3, animated: true, completion: nil)
    }
    
    0 讨论(0)
  • 2020-12-09 12:33
    let parent = self.parentViewController!
    
    parent.dismissViewControllerAnimated(true, completion: {
                let vc = self.storyboard?.instantiateViewControllerWithIdentifier("OrderViewController")
                parent.presentViewController(vc!, animated: true, completion: nil)
            })
    
    0 讨论(0)
  • 2020-12-09 12:34

    you can't do that because when the UIViewController A calls the UIViewController B and the first controller is dismissed then the two controllers are nil.

    You need to have a UIViewController as a base, in this case MainViewController is the base. You need to use a protocol to call the navigation between controllers.

    you can do using protocol let say for example as bellow:-

    In to your viewController setting Protocol :

        protocol FirstViewControllerProtocol {
        func dismissViewController()
    }
    
    class FirstViewController: UIViewController {
        var delegate:FirstViewControllerProtocol!
    
        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 goBack(sender: AnyObject) {
            self.dismissViewControllerAnimated(true) { 
                self.delegate!.dismissViewController()
            }
        }
    

    Now in your main view controller

    class MainViewController: UIViewController, FirstViewControllerProtocol {
    
    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 goToFirstViewController(sender: AnyObject) {
        let viewController = self.storyboard?.instantiateViewControllerWithIdentifier(String(FirstViewController)) as! FirstViewController
        viewController.delegate = self
        self.presentViewController(viewController, animated: true, completion: nil)
    }
    
    
    
    //MARK: Protocol
    func dismissViewController() {
        if let viewController = self.storyboard?.instantiateViewControllerWithIdentifier(String(SecondViewController)){
            self.presentViewController(viewController, animated: true, completion: nil)
        }
    }
    

    Code example with storyboard:


    0 讨论(0)
提交回复
热议问题