如果您推送并呈现多个视图控制器,如何移动到 parentViewController?

Posted

技术标签:

【中文标题】如果您推送并呈现多个视图控制器,如何移动到 parentViewController?【英文标题】:How to move to parentViewController if you push and present multiple viewControllers? 【发布时间】:2018-01-10 14:59:44 【问题描述】:

我有一个 tabBar 控制器作为父级,我正在推送一个带有 navigationController 的视图控制器。然后向它展示上面的 2 个其他视图控制器。它就像 Tabbar(homeController) -> Child1(push) -> Child 2(presenting) -> child3(presenting)。我使用计时器解雇了我的最后一个 childViewController。当它被解雇时,我想回到 tabBarController(home)。

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

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

【问题讨论】:

vc 中的parent?.present(vc, animated: true, completion: nil) 是什么? 您是使用故事板还是手动设置所有内容? @UpholderOfTruth 我正在使用 segue 查看我的回答,了解如何处理。 【参考方案1】:

如果您使用的是故事板,那么首先在您想要返回的视图控制器上设置一个展开转场(在这种情况下为 tabBarController),如下所示:

@IBAction func unwindToTop(segue:UIStoryboardSegue)  

(你可以随意调用它,只要你启动它'unwindTo')

然后在界面构建器中创建一个展开转场(直接从按钮等对象或更通用的视图控制器本身)到视图控制器的出口,并选择应该出现在列表中的展开转场。

然后当这个转场被执行时,无论是通过情节提要项目还是在代码中手动执行,您都将返回到定义展开转场的视图控制器。系统会为你完成所有的回溯。

【讨论】:

【参考方案2】:

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

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

以上代码将关闭所有呈现的 ViewController。如果你把它放在至少一个孩子(在我的情况下是孩子 3)它会自动解雇我的孩子 2,孩子 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
            )
        

【讨论】:

【参考方案3】:

你应该检查 popToRootViewController 方法。

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

【讨论】:

所描述的流程是模态链,而不是推送的视图控制器。 hmm...“我正在推送一个带有 navigationController 的视图控制器。然后向它展示上面的 2 个其他视图控制器” 完全正确。他有一个tabbarcontroller,呈现模态导航视图控制器包含孩子1。推送到孩子2,呈现模态孩子3,呈现模态孩子4 .他想回到tabbarcontroller。 popToRootViewController 没用。 "就像 Tabbar(homeController) -> Child1(push) -> Child 2(presenting) -> child3(presenting )"

以上是关于如果您推送并呈现多个视图控制器,如何移动到 parentViewController?的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭已呈现未推送的多个视图控制器?

如何从呈现的视图控制器上的按钮操作推送视图控制器

如何在一种情况下推送视图控制器,但在另一种情况下以模态方式呈现它?

UIScrollview 在向下滚动并推送新的视图控制器后向上移动内容

RxCocoa - 当有延迟时防止多个视图控制器推送

如何让你的推送通知打开某个视图控制器?