解雇目前的视图控制器后提出新的视图控制器 - swift

问题描述:

我试图解雇一个VC并提出一个新的VC。但我不希望旧的VC再存在。我使用下面的代码来解散当前的VC并呈现新的。但这样,解雇与现在之间有一段时间间隔。我不希望用户注意到这一点。所以,我想先介绍一下新的VC,然后解散前一个。有没有办法做到这一点?解雇目前的视图控制器后提出新的视图控制器 - swift

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let destinationController = self.storyboard?.instantiateViewController(withIdentifier: "login") as! Login 
let presentingVC = self.presentingViewController 
self.dismiss(animated: false, completion: {() -> Void in 
    presentingVC!.present(destinationController, animated: true, completion: nil) 
}) 
+0

为什么不按顺序,先出现然后解雇(而不是现在的完成处理程序)呢?所以: 'presentVC!.present(destinationController,animated:true,completion:nil); self.dismiss(animated:false,completion:nil)' –

+0

朋友你为什么要从堆栈中解散currentVc? –

+0

直接可以通过使动画为假来解雇您。 –

我认为最好的办法是在实际回去时关闭当前的VC。这意味着,出示您的destinationController使用当前的VC,然后当你回去,认为这两个VC的

+0

我认为这将是一个更好的主意,感谢您的帮助。 –

免责声明

所以,除非你绝对需要模态地呈现新的VC,那么我建议只是执行SEGUE两个VC之间。看起来你只是以模态方式呈现它,因为你想在以后从原始VC手动解除它。在我看来,不仅使用segue更容易,而且它还允许您使用下面概述的方法。

解决方案

这可能不是最巧妙的方法,但你可以通过prepareForSegue通过老VC的情况下一个VC,然后在新的VC的viewDidLoad驳回。

例如,在新的VC,你可以有这样的事情:

class NewVC: UIViewController { 

    ... 
    var prevVC: PrevVC! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     prevVC.dismiss(animated: false, completion: nil) 
    } 

} 

所以,当你的NEWVC负载,它否定了以前的VC。您需要在prevVC类中执行的操作就是像prepareForSegue那样传递实例。

class PrevVC: UIViewController { 
    ... 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let destinationVC = segue.destination as? NewVC { 

      destinationVC.prevVC = self 

     } 
    } 

} 

那么当然,你只需要提出新的VC,当你想要的,然后一切都会照顾。

+0

它看起来像是以模态的方式呈现VC的,所以不会在提交的VC上解雇所提交的VC以及解雇? – JohnnyAW

+0

@JohnnyAW我看到这里的困境。没有看到。幸运的是,他似乎只是模态地呈现,以便以后可以手动解散它。因此,如果他只是执行一个赛格,那么就不应该有问题。我将编辑我的帖子以包含此信息。 –