有些RootViewController呈现aParentViewController而不是aChildViewController
如何将动画的ChildViewController直接取消到不需要再次显示RootViewControllerParentViewController
详细
假设有一些显示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)

10-07 19:13