我正在尝试解雇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)
})
答案 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()函数就可以正常工作。
我想这是因为我一开始就没有一个好的设计,它可以工作,但是我认为如果一开始就拥有一个好的结构,您就不会遇到这个问题。