在呈现新视图控制器后关闭当前视图控制器 - swift
dismiss current view controller AFTER presenting new view controller - swift
我正在尝试关闭一个 VC 并展示一个新的 VC。但我不希望旧 VC 存在了。我使用下面的代码关闭当前 VC 并显示新的。但是这样,在 dismiss 和 present 之间有一个时间间隔。我不希望用户注意到这一点。所以,我想先介绍新的 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)
})
我认为最好的办法是当你真正回去的时候解散当前的VC。这意味着,使用当前的 VC 展示你的 destinationController
,然后当你返回时,关闭两个 VC 的
免责声明
所以除非你绝对需要模态地展示你的新 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)
}
}
因此,当您的新 VC 加载时,它会忽略之前的 VC。您在 prevVC class 中需要做的就是像这样传递 prepareForSegue
中的实例。
class PrevVC: UIViewController {
...
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destinationVC = segue.destination as? NewVC {
destinationVC.prevVC = self
}
}
}
当然,您只需在需要时展示新的VC,然后其他一切都会得到处理。
如果您想展示 VC A 中的 VC B 并想在展示时关闭 VC A,您可以使用此代码:
您在 VC A 中编写此代码,您希望从哪个 Button 显示 VC B。
let parentVC = presentingViewController
dismiss(animated: true) {
let vc = self.storyboard!.instantiateViewController(withIdentifier...)
parentVC.present(vc, animated: true)`enter code here`
}
我的做法是两者都用
view.dismiss(animated: true, completion: nil)
和
presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil)
取决于之前有多少个视图控制器。因为它们都是可选的,所以当你试图解雇时,如果你没有它们,Xcode 不会抱怨。如果是这样,单个 dismiss() 函数就可以正常工作。
我猜是因为我一开始就没有一个好的设计,它可以工作,但我认为如果你一开始就有一个好的结构,你就不会 运行 .
所以我刚刚在 Xcode13 中尝试了这个。 VC_A 转入 VC_B。我试图在 segue 之后关闭 VC_A 以及将 VC_A 传递给 VC_B 并在 VC_B 的 viewDidLoad 中关闭 VC_A。当我关闭 VC_B 时,它会返回到 VC_A (也打印了 deinit 并且它永远不会被调用)。
我正在尝试关闭一个 VC 并展示一个新的 VC。但我不希望旧 VC 存在了。我使用下面的代码关闭当前 VC 并显示新的。但是这样,在 dismiss 和 present 之间有一个时间间隔。我不希望用户注意到这一点。所以,我想先介绍新的 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)
})
我认为最好的办法是当你真正回去的时候解散当前的VC。这意味着,使用当前的 VC 展示你的 destinationController
,然后当你返回时,关闭两个 VC 的
免责声明
所以除非你绝对需要模态地展示你的新 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)
}
}
因此,当您的新 VC 加载时,它会忽略之前的 VC。您在 prevVC class 中需要做的就是像这样传递 prepareForSegue
中的实例。
class PrevVC: UIViewController {
...
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destinationVC = segue.destination as? NewVC {
destinationVC.prevVC = self
}
}
}
当然,您只需在需要时展示新的VC,然后其他一切都会得到处理。
如果您想展示 VC A 中的 VC B 并想在展示时关闭 VC A,您可以使用此代码:
您在 VC A 中编写此代码,您希望从哪个 Button 显示 VC B。
let parentVC = presentingViewController
dismiss(animated: true) {
let vc = self.storyboard!.instantiateViewController(withIdentifier...)
parentVC.present(vc, animated: true)`enter code here`
}
我的做法是两者都用
view.dismiss(animated: true, completion: nil)
和
presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil)
取决于之前有多少个视图控制器。因为它们都是可选的,所以当你试图解雇时,如果你没有它们,Xcode 不会抱怨。如果是这样,单个 dismiss() 函数就可以正常工作。
我猜是因为我一开始就没有一个好的设计,它可以工作,但我认为如果你一开始就有一个好的结构,你就不会 运行 .
所以我刚刚在 Xcode13 中尝试了这个。 VC_A 转入 VC_B。我试图在 segue 之后关闭 VC_A 以及将 VC_A 传递给 VC_B 并在 VC_B 的 viewDidLoad 中关闭 VC_A。当我关闭 VC_B 时,它会返回到 VC_A (也打印了 deinit 并且它永远不会被调用)。