【问题标题】:Multiple persistent view controllers多个持久视图控制器
【发布时间】:2014-11-18 12:05:01
【问题描述】:

我正在尝试编写一个具有菜单视图控制器的应用程序,该控制器带有三个按钮,每个按钮对应一个单独的视图。我们分别称这些视图为 v1、v2 和 v3。

应用程序的正常操作要求在这三个视图中随机循环,即查看 v1 的用户可以转换到 v2 或 v3。我目前正在通过调用self.performSegueWithIdentifier("mySegue", sender: self) 以模态方式展示这三个视图控制器。

我目前正在围绕这三个视图控制器进行导航,如果它们尚未在堆栈中,则以模态方式呈现它们,或者在当前视图控制器或其父级上调用 dismissViewControllerAnimated,具体取决于所需视图的层次结构是。

这样做的问题是,如果用户呈现所有三个视图,则会产生如下堆栈: menu -> v1 -> v2 -> v3,然后先导航回 v1,然后再导航回 v3。这会导致 v3 和 v2 都被解除,然后重新创建 v3,从而失去与这些视图控制器的任何先前交互。

有没有办法创建一个层次结构,在不关闭这些视图控制器的情况下仍然允许在任意两个视图之间导航?

编辑:由于自定义的限制,我正在避免使用 UITabBarController,我有某些过渡动画与我的等效“标签栏”的元素交互,这是我无法使用预先存在的类。

【问题讨论】:

标签: ios swift


【解决方案1】:

只有当你确定 UITabBarController 不是你想要的时才这样做。听起来可能是这样。

是的,有几种方法可以做到这一点。立即想到的是有一个 ma​​nager 类来处理视图控制器等的导航和创建......

因此,您现在正在创建您的第一个视图控制器并将其放在屏幕上,而不是您现在创建这个 ma​​nager 类。然后你告诉它顶部显示第一个视图控制器。

所以,现在你在vc1。 (注: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;
                    }];
}

【讨论】:

    【解决方案2】:

    我建议使用 UITabBarController,它完全符合您的要求,无需任何额外工作 :)

    【讨论】:

    • 嗯,是的。这比我的回答要容易得多。我想我驳回了它,因为很明显我认为 OP 不想使用 TabBarController。哈哈
    • 是的,它的行为与 TabBarConroller 非常相似,但 TabBarController 在自定义方面的选择非常有限。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 2014-02-22
    相关资源
    最近更新 更多