在Swift中关闭并呈现视图控制器

嗨,我正在尝试提供一个viewcontroller并关闭我当前的模态视图,但此代码无法正常工作

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

反之亦然,在presentviewcontroller的完成块上也不起作用

编辑:更换vc! 自我

你必须得到提供self(当前ViewController)的viewController。 如果该视图控制器是rootViewController,您可以使用如下,如果不是该查询它基于您查看控制器层次结构。

 if let vc3 = self.storyboard?.instantiateViewControllerWithIdentifier("vc3") as? ViewController3 { let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate appDelegate.window?.rootViewController!.presentViewController(vc3, animated: true, completion: nil) } 

你不能这样做,因为当UIViewController A调用UIViewController B并且第一个控制器被解除时,两个控制器都是nil。

你需要有一个UIViewController作为基础,在这种情况下,MainViewController是基础。 您需要使用协议来调用控制器之间的导航。

你可以使用协议,比如说如下: –

在你的viewController设置协议中:

  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() } } 

现在在主视图控制器中

 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) } } 

故事板的代码示例:


我认为你的代码中有一个错误,’self’应该是呈现视图控制器来呈现’vc’,而不是’vc’它自己

你的代码

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

尝试这个

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

希望这是有帮助的

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

这是Swift3的解决方案

要呈现ViewController

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

要关闭ViewController:

 self.dismiss(animated: true, completion: nil) 
 if let vc = storyboard?.instantiateViewController(withIdentifier: "IdOfYourVC") { present(vc, animated: true, completion: nil) }