我有一个带有两个选项卡的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
时,它完全替换了navigationViewController
的viewcontroller
堆栈,因此您需要在numVCs
阵列中添加ViewPurple
,并将ViewPurple
设置为根视图控制器。
因此,在调用popToRootViewController
时,将移回ViewPurple
。