Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何以编程方式松开或弹出背面UIBarButton上的多个ViewController?_Ios_Swift_Uiviewcontroller_Uibarbuttonitem - Fatal编程技术网

Ios 如何以编程方式松开或弹出背面UIBarButton上的多个ViewController?

Ios 如何以编程方式松开或弹出背面UIBarButton上的多个ViewController?,ios,swift,uiviewcontroller,uibarbuttonitem,Ios,Swift,Uiviewcontroller,Uibarbuttonitem,我有以下6个视图控制器。 VCA,VCB,VCC,VCD,VCE,VCF mainVC-->VCA-->VCB-->VCC-->VCD..VCE mainVC-->VCA-->VCD..VCF (->)通过分段连接,而(…)VCE和VCF通过编程方式推入导航控制器 我的问题是如何将多个ViewController从VCD、VCE或VCF弹出到VCA上的BackUIBarButtonnavigationController 根据这一点,我们提出了以下问题:- 尝试了此代码,但无效 overrid

我有以下6个视图控制器。
VCA
VCB
VCC
VCD
VCE
VCF

mainVC
-->
VCA
-->
VCB
-->
VCC
-->
VCD
..
VCE

mainVC
-->
VCA
-->
VCD
..
VCF

(->)通过分段连接,而(…)
VCE
VCF
通过编程方式
推入导航控制器

我的问题是如何将多个ViewController从
VCD
VCE
VCF
弹出到
VCA
上的
Back
UIBarButton
navigationController

根据这一点,我们提出了以下问题:-

尝试了此代码,但无效

override func viewDidLoad {
    super.viewDidLoad()
    self.navigationItem.hidesBackButton = true
    let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.plain, target: self, action: #selector(YourViewController.back(sender:)))
    self.navigationItem.leftBarButtonItem = newBackButton
}

func back(sender: UIBarButtonItem) {
   let presentingViewController = self.presentingViewController
   self.dismissViewControllerAnimated(false, completion: {
   presentingViewController!.dismissViewControllerAnimated(true, completion: {}) //.dismiss(animated:true, completion:{})
   })
}

navigationController?中删除所有视图控制器。当前视图控制器(将是最后一个)和视图控制器之间的视图控制器
,然后执行
navigationController?.popViewController(动画:true)

如果您知道
VCA
被推到
mainVC
上,然后,您的导航控制器堆栈是
[mainVC,VCA,VCB,…,VCF]
[mainVC,VCA,VCD,…,VCF]
,因此您希望在堆栈的第1项弹出到VC:

func back(sender: UIBarButtonItem) {

        if let vc = navigationController?.viewControllers[1] {
            _ = navigationController?.popToViewController(vc, animated: true)
        }

}
如果您真正想做的是跳回导航控制器的根目录VC,您可以简单地:

func back(sender: UIBarButtonItem) {

        _ = navigationController?.popToRootViewController(animated: true)

}
编辑:

其他信息:

// if you want to pop to the First VC, regardless of VC type
func popToFirst() {

    if let vc = navigationController?.viewControllers[1] {
        _ = navigationController?.popToViewController(vc, animated: true)
    } else {
        print("NO VC found as element 1 in navigation controller's stack")
    }

}

// if you want to pop to the First VC, but
// *only* if it is an instance of VCAViewController
func popToFirstOnlyIfA() {

    if let vc = navigationController?.viewControllers[1] as? VCAViewController {
        _ = navigationController?.popToViewController(vc, animated: true)
    } else {
        print("viewControllers[1] is NOT an instance of VCAViewController")
    }

}

// if you want to pop to an instance of VCAViewController,
// whether it's the root, first, second, third, etc VC in the stack
func popToAAnywhereInTheStack() {

    guard let aVCs = navigationController?.viewControllers else {
        print("No Array of View Controllers from navigationController!")
        return
    }

    for vc in aVCs {
        if vc is VCAViewController {
            _ = navigationController?.popToViewController(vc, animated: true)
            return
        }
    }

    print("No instance of VCAViewController found in the stack")

}

// if you simply want to pop to the navigation controller's Root VC
func popToRoot() {

    _ = navigationController?.popToRootViewController(animated: true)

}

尝试实施。@pacification,但我没有对
VCE
VCF
使用segue,解绑segue将不起作用。这里有
mainVC
导航控制器和
VCA
根控制器用于
mainVC
?或者是
mainVC
根目录,并且
VCA
被推了吗?@错误我的答案有什么问题吗?谢谢,这对我很有效。但我有一个疑问,你认为
viewController[1]
可以是任何其他VC吗?当然,如果索引1处的VC不是VCA的实例,那么您将无法访问VCA。查看我的编辑以了解更多信息和其他方法。