我正在尝试编写一个具有菜单视图控制器的应用程序,其中包含三个按钮,每个按钮对应一个单独的视图。我们分别称这些视图为v1,v2和v3。
app的正常操作要求在这三个视图中随机循环,即查看v1的用户可以转换为v2或v3。我目前通过调用self.performSegueWithIdentifier("mySegue", sender: self)
以模态方式呈现这三个视图控制器。
我目前正在这三个视图控制器中导航,如果它们不在堆栈中,则通过模态显示它们,或者在当前视图控制器或其父级上调用dismissViewControllerAnimated
,具体取决于层次结构的距离期望的观点是。
问题在于,如果用户呈现所有三个视图,则会产生如下堆栈: 菜单 - > v1 - > v2 - > v3然后先导航回v1,然后再导航回v3。这会导致v3和v2被解除,然后重新创建v3,从而失去与这些视图控制器的任何先前交互。
有没有办法创建一个可以在不关闭这些视图控制器但仍允许在任意两个视图之间导航的情况下运行的层次结构?
编辑:由于自定义的限制,我正在避开UITabBarController,我有一些过渡动画与我的等效“标签栏”的元素交互,我不能对预先存在的类做。
答案 0 :(得分:1)
如果您确定UITabBarController不是您想要的,请执行此操作。听起来可能就是这样。
是的,有几种方法可以做到这一点。立即想到的是拥有一个经理类来处理视图控制器的导航和创建等......
因此,在您正在创建第一个视图控制器并将其放在屏幕上的位置上,您现在可以创建此管理器类。然后你告诉它顶部显示第一个视图控制器。
所以,现在你在vc1
。 (N.B。vc1
可以存储为经理类的属性,因此它可以保持持久性。)
在vc1中,当用户点击“转到vc2
”位时,所有vc1
所做的就是与管理员对话(可能通过委托方法)。对于类似...... [self.delegate moveToViewController2];
然后管理器类检查是否已经实例化vc2
(如果没有实例化则这样做),然后显示它。
就他们之间的转换而言,你可以在经理类中做这样的事情......
- (void)moveToViewController2
{
UIViewController *viewController2 = //get or create vc2
[self transitionToViewController:viewController2 withTransition:UIViewAnimationOptionTransitionFlipFromRight]; // or whichever transition you want
}
- (void)transitionToViewController:(UIViewController *)controller withTransition:(UIViewAnimationOptions)transition
{
[UIView transitionFromView:self.window.rootViewController.view
toView:controller.view
duration:0.65
options:transition
completion:^(BOOL finished) {
self.window.rootViewController = controller;
}];
}
答案 1 :(得分:0)
我建议使用UITabBarController,它完全按照您的要求进行,无需任何额外工作:)