如何将一组新的视图控制器从一个选项卡推送到另一个选项卡



我有一个带有两个选项卡的tabBarController。每个选项卡中都有一个navigationController。每个navigationController有3个子viewControllers

tabBarController
/            
tabOne          tabTwo
/                  
NumNavController     ColorNavController
|                      |
ViewOne                ViewBlack
|                      |
ViewTwo                 ViewRed
|                      |
ViewThree               ViewPurple//(beginning)
|
myButton
//myButton pushes on ViewOne>ViewTwo>ViewThree(end)

我在ViewPurple里面有一个按钮,当按下时,我想按下ViewOne、ViewTwo,然后是ViewThree。

(beginning)ViewPurple > ViewOne > ViewTwo > ViewThree(end)

因此,从ViewThree开始,我会回到ViewPurple-这就是我试图实现的目标

(beginning)ViewPurple < ViewOne < ViewTwo < ViewThree(end)

在ViewPurple内部,我将ColorNavController重置为NumNavController的子控制器。

let numVCs = [viewThreeVC, viewTwoVC, viewOneVC]
self.navigationController?.setViewControllers(numVCs, animated: true)
//Apple docs says to set them backwards
//The view controllers to place in the stack. The front-to-back order of the controllers in this array represents the new bottom-to-top order of the controllers in the navigation stack. Thus, the last item added to the array becomes the top item of the navigation stack

我遇到的问题是,一旦我按下ViewOne并按下后退按钮,而不是进入ViewPurple,我就会进入ViewTwo。它陷入了一个奇怪的循环,似乎不知道开始的viewController在哪里了

//I can't push back to ViewPurple
ViewOne < ViewTwo < ViewOne < ViewTwo < ViewThree(end)

问题出在哪里?如何返回ViewPurple

ViewPurple:(第一种方式-没有崩溃,但奇怪的循环)

class ViewPurple: UIViewController {
@IBAction func myButton(sender: UIButton){
self.presentNewVCs()
}
func presentNewVCs(){
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let viewOneVC = mainStoryboard.instantiateViewControllerWithIdentifier("ViewOne") as! ViewOneController
let viewTwoVC = mainStoryboard.instantiateViewControllerWithIdentifier("ViewTwo") as! ViewTwoController
let viewThreeVC = mainStoryboard.instantiateViewControllerWithIdentifier("ViewThree") as! ViewThreeController
let numVCs = [viewThreeVC, viewTwoVC, viewOneVC]
self.navigationController?.setViewControllers(numVCs, animated: true)
}
}

我还尝试了第二种方法来呈现NumNavController,但我一直得到一个异常'Application tried to present modally an active controller。我对ViewPurple做了一个很弱的参考,并试图去它,但它仍然崩溃了

ViewPurple:(第二路-崩溃)

class ViewPurple: UIViewController {
weak var parent:ViewPurple!
@IBAction func myButton(sender: UIButton){
self.presentNewVCs()
}
func presentNewVCs(){
let numNavController = self.tabBarController!.viewControllers![0] as! NumNavController
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let viewOneVC = mainStoryboard.instantiateViewControllerWithIdentifier("ViewOne") as! ViewOneController
let viewTwoVC = mainStoryboard.instantiateViewControllerWithIdentifier("ViewTwo") as! ViewTwoController
let viewThreeVC = mainStoryboard.instantiateViewControllerWithIdentifier("ViewThree") as! ViewThreeController
let numVCs = [viewThreeVC, viewTwoVC, viewOneVC]
numNavController.setViewControllers(numVCs, animated: true)
self.presentViewController(numNavController, animated: true, completion: nil)
}
deinit{
self.parent = nil
}
}

能否更新buttonAction:

@IBAction func myButton(sender: UIButton){ 
let viewOneVC =  mainStoryboard.instantiateViewControllerWithIdentifier("ViewOne") as! ViewOneController 
self.navigationController.pushViewController(viewOneVC, animate:true) 
}

首先,不能显示NumNavController,因为它已经是tabBarController的一部分。

当调用setViewControllers时,它完全替换了navigationViewControllerviewcontroller堆栈,因此您需要在numVCs阵列中添加ViewPurple,并将ViewPurple设置为根视图控制器。

因此,在调用popToRootViewController时,将移回ViewPurple

相关内容

最新更新