有些RootViewController
呈现aParentViewController
而不是aChildViewController
。
如何将动画的ChildViewController
直接取消到不需要再次显示RootViewController
的ParentViewController
?
详细
假设有一些显示ParentViewController
,它允许用户输入一些凭据以登录到某个用户帐户。
连接建立后,ParentViewController
将向用户显示连接/帐户详细信息
当用户关闭ChildViewController
时,应该以动画形式(向下滑动等)将其取消。但是用户不应该返回ChildViewController
而是应该直接返回ParentViewController
当然,这是有可能的,RootViewController
并不表示ParentViewController
本身,而是(以某种方式)告诉ChildViewController
这一点。这样从RootViewController
直接返回到ChildViewController
就没有问题了。然而,这不是我要找的,因为RootViewController
不应该知道RootViewController
或者甚至不关心ChildViewController
是否有其他风投。
我正在寻找一个解决方案,其中ParentViewController
控制它自己是在它提供的VC被解除后显示,还是在它的父VC(=根VC)之后显示。
代码:
typealias CompletionBlock = () -> Void
class RootViewController: UIViewController {
@IBAction func showParentVC(_ sender: Any) {
let parentVC = ParentViewController()
parentVC.completion = {
self.dismiss(animated: true, completion: nil)
}
present(parentVC, animated: true)
}
}
class ParentViewController: UIViewController {
var completion: CompletionBlock?
@IBAction func showChild(_ sender: Any) {
let childVC = ChildViewController()
childVC.completion = {
self.completion?()
}
present(childVC, animated: true)
}
}
class ChildViewController: UIViewController {
var completion: CompletionBlock?
@IBAction func close(_ sender: Any) {
completion?()
}
}
使用此代码无法解决所描述的问题。如果在
ParentViewController
上调用close
,则ChildViewController
调用RootViewController
。这样,self.dismiss(animated: true, completion: nil)
动画消失,ChildViewController
变为可见。然后ParentViewController
动画消失,ParentViewController
变为可见。如何跳过
RootViewController
并在设置ParentViewController
动画后直接显示RootViewController
? 最佳答案
我的建议是将RootViewController嵌入到一个NavigationController中(如果您还没有它的话),并将
navigationController?.present(viewController, animated: true, completion: nil)
//instead of viewController.present(...)
然后可以从childViewController中使用此方法
navigationController?.popToRootViewController(animated: true)