在呈现新视图控制器后,关闭当前视图控制器 - swift

时间:2017-02-20 08:09:53

标签: ios swift dismiss presentviewcontroller

我正在尝试解雇VC并提出新的VC。但我不希望旧的VC再存在。我使用下面的代码来关闭当前的VC并提供新的VC。但是这样,在解雇和现在之间有一段时间间隔。我不希望用户注意到这一点。所以,我想首先提出新的VC然后解雇前一个。有没有办法做到这一点?

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

4 个答案:

答案 0 :(得分:10)

<强>声明

因此,除非您绝对需要以模态方式呈现新VC,否则我建议您只在两个VC之间执行segue。您似乎只是以模态方式呈现它,因为您想稍后从原始VC手动关闭它。在我看来,不仅使用segue这更容易,而且还允许您使用我在下面概述的方法。

<强>解决方案

这可能不是最优雅的方法,但您可以将旧VC的实例通过prepareForSegue传递到下一个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,然后其他一切都会得到照顾。

答案 1 :(得分:4)

我认为最好的方法是在你真正回去时解雇当前的VC。这意味着,使用当前的VC展示您的{{1}},然后当您返回时,忽略两个VC

答案 2 :(得分:1)

如果要从VC A中呈现VC B,并且想在呈现时关闭VC A,则可以使用以下代码:

您将此代码编写在VC A中,您要从哪个按钮显示VC B。

let parentVC = presentingViewController
dismiss(animated: true) {
    let vc = self.storyboard!.instantiateViewController(withIdentifier...)
    parentVC.present(vc, animated: true)`enter code here`
}

答案 3 :(得分:0)

我的方法是同时使用两者

view.dismiss(animated: true, completion: nil)

presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil)

取决于之前有多少个视图控制器。因为它们都是可选的,所以当您尝试关闭时,如果没有它们,Xcode不会抱怨。如果是这种情况,单个dismiss()函数就可以正常工作。

我想这是因为我一开始就没有一个好的设计,它可以工作,但是我认为如果一开始就拥有一个好的结构,您就不会遇到这个问题。