Ios 如何以编程方式松开或弹出背面UIBarButton上的多个ViewController?
我有以下6个视图控制器。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
VCA
,VCB
,VCC
,VCD
,VCE
,VCF
mainVC
-->VCA
-->VCB
-->VCC
-->VCD
..VCE
mainVC
-->VCA
-->VCD
..VCF
(->)通过分段连接,而(…)VCE
和VCF
通过编程方式推入导航控制器
我的问题是如何将多个ViewController从VCD
、VCE
或VCF
弹出到VCA
上的Back
UIBarButtonnavigationController
根据这一点,我们提出了以下问题:-
尝试了此代码,但无效
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。查看我的编辑以了解更多信息和其他方法。