如果您推送并呈现多个 viewController,如何移动到 parentViewController?

How to move to parentViewController if you push and present multiple viewControllers?

我有一个 tabBar 控制器作为 parent,我正在推送一个带有 navigationController 的视图控制器。然后将上面的 2 个其他视图控制器呈现给它。它就像 Tabbar(homeController) -> Child1(push) -> Child 2(presenting) -> child3(presenting)。我使用计时器解雇了我的最后一个孩子ViewController。当它解雇时我想回到 tabBarController(home)。

let parent = self.presentingViewController
self.dismiss(animated: false, completion: {
    parent?.present(vc, animated: true, completion: nil)
})

我把上面的代码放在我的第二个 Child ViewController 中。但它又回到了 child1 viewContoller。这里需要一些帮助。

您应该检查 popToRootViewController 方法。

https://developer.apple.com/documentation/uikit/uinavigationcontroller/1621855-poptorootviewcontroller

如果您使用的是故事板,那么首先在您想要 return 的视图控制器上设置展开转场(在本例中为 tabBarController),如下所示:

@IBAction func unwindToTop(segue:UIStoryboardSegue) { }

(只要你启动它就可以随意命名'unwindTo')

然后在 Interface Builder 中创建一个 unwind segue(直接从按钮之类的对象或更通用的视图控制器本身)到视图控制器的出口和 select 应该出现的 unwind segue在列表中。

然后,当通过故事板项目或手动代码执行此转场时,您将 returned 到定义展开转场的视图控制器。系统会为你做所有的反向遍历。

终于在这里找到了另一个选择。

self.view.window!.rootViewController?.dismissViewControllerAnimated(false, completion: nil)

以上代码将关闭所有呈现的 ViewController。如果你把它放在至少 child(child 3 在我的例子中)它会自动关闭我的 child 2, child 3.

let parentVC = self.presentingViewController

        if let tabParent = parentVC as? UITabBarController, let firstNav = tabParent.viewControllers![0] as? UINavigationController {
            //present child 2
            self.present(vc, animated: true, completion: {
                firstNav.popToRootViewController(animated: false)// pop to my rootVC
            })
        }