【问题标题】:Navigate to root view-controller from modally presented view controller从模态呈现的视图控制器导航到根视图控制器
【发布时间】:2021-09-20 00:30:46
【问题描述】:

我有以下场景。

根视图控制器 - A

推送视图控制器 - B

呈现的视图控制器 - C

A -> 推 B.

B -> 呈现 C。

我怎样才能从 C 回到 A。

【问题讨论】:

    标签: ios swift uinavigationcontroller pushviewcontroller presentviewcontroller


    【解决方案1】:

    您可以在 C 中编写以下内容

    let presenting = self.presentingViewController ?? self.navigationController?.presentingViewController
    let navCtrl1 = presenting as? UINavigationController // in case you presented C using b.navigationController.present...
    let navCtrl2 = presenting?.navigationController // in case you presented c using b.present...
    if let navCtrl = navCtrl1 ?? navCtrl2  {
        self.dismiss(animated: true, completion: {
            navCtrl.popToRootViewController(animated: true)
        })
    }
    

    更新

    我想知道是否有绕过关闭并直接弹出到根视图控制器的方法。我想避免显示视图控制器 B

    let presenting = self.presentingViewController ?? self.navigationController?.presentingViewController
    let navCtrl1 = presenting as? UINavigationController // in case you presented C using b.navigationController.present...
    let navCtrl2 = presenting?.navigationController // in case you presented c using b.present...
    if let navCtrl = navCtrl1 ?? navCtrl2  {
        navCtrl.popToRootViewController(animated: false)
        self.dismiss(animated: true, completion: nil)
    }
    

    【讨论】:

    • 嗨,欣赏它,但我想知道是否有绕过解雇和直接弹出到根视图控制器。我想避免显示 View-controller B
    • @Angel 查看更新
    【解决方案2】:

    怎么做?

    要实现这一点,您必须将呈现控制器 UINavigationController 作为变量传递给您是 present-ing 的视图控制器。让我告诉你怎么做,结果如何。

    vcA 推送到vcB 相当简单。需要注意的一点是,当您从 vcA 推送到 vcB 时,vcA 将在导航堆栈中。考虑到这一点,让我移动一个。

    首先对vcC 进行更改,添加一个变量来保存呈现vcC 的视图控制器的UINavigationCongroller,即vcB。执行以下操作(阅读评论)

    class ViewControllerC: UIViewController {
    
        // Variable that holds reference to presenting ViewController's Navigtion controller
        var presentingNavigationController: UINavigationController!
    
        //Some action that triggers the "Go-back-to-A"
        @objc func pressed() {
            // When the completion block is executed in dismiss,
            // This function will loop through all ViewControllers in the presenting Navigation stack to see if vcA exists
            // Since vcA was earlier pushed to the navigation stack it should exist
            // So we can use the same navigation controller to pop to vcA    
            // Set the animated property to false to make the transition instant
            dismiss(animated: false) {
                self.presentingNavigationController.viewControllers.forEach({
                    if let vc = $0 as? ViewController {
                        self.presentingNavigationController.popToViewController(vc, animated: true)
                    }
                })
            }
        }
    

    vcB 中,您可以将以下内容添加到present(_:_:_:) 函数中

    // function call
    @objc func pressed() {
        let vc = ViewControllerC()
        // Setting the navigation controller for reference in the presented controller
        vc.presentingNavigationController = self.navigationController  
        present(vc, animated: true, completion: nil)
    }
    

    结果

    【讨论】:

    • 嗨,欣赏它,但我想知道是否有绕过解雇和直接弹出到根视图控制器。我想避免显示 View-controller B
    • 检查新代码和示例。 VCB 是一个有点引人注目的想法。如果它工作很酷。我所做的是将dismiss(_:) 方法中的animated 属性从true 更改为false
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多