在两个 UIViewController 堆栈之间转换

Posted

技术标签:

【中文标题】在两个 UIViewController 堆栈之间转换【英文标题】:Transitioning between two UIViewController stacks 【发布时间】:2013-10-24 06:56:50 【问题描述】:

我正计划在我的应用程序中在应用程序委托中有一个根 UIViewController,它基本上分支成可能的两个 UIViewControllers,每个 UIViewControllers 将有多个 UINavigationControllers 推送到其中,可能有一个UITabBarController,还不太确定,但主要问题是我想从一个UIViewController 堆栈到另一个堆栈的任何视图传输,并维护视图层次结构。

当我想从一个 UIViewController 堆栈更改为另一个堆栈时,我考虑过调用 App 委托:

MainClass *appDelegate = (MainClass *)[[UIApplication sharedApplication] delegate];
[appDelegate.viewController someMethod];

并以这种方式进行转换,但这似乎有点笨拙。还想过通过堆栈将引用传递给根UIViewController,并调用方法在UIViewControllers之间进行切换。

哪种方式更好?或者有没有一种我没有想到的方法是首选的方法?

【问题讨论】:

最好用delegate从一个vc栈切换到另一个,并维护视图层次,通过层次传递消息到栈顶,让顶层delegate给rootVC,然后让rootVC 做实际的转换 【参考方案1】:

你的意思是你有一个根视图控制器,这个根 VC 管理两个视图控制器,这两个控制器管理许多子视图控制器?

如果是这样,您可以尝试使用自定义遏制控制器。并且每次您想将堆栈从一个更改为另一个时,只需委托给 rootVC 即可。

- (void)moveToAnotherController:(UIViewController *)vc

    [self displayContentController:vc];


- (void)displayContentController:(UIViewController *)content

    [self addChildViewController:content];
    [self.view addSubview:content.view];
    [content.view setFrame:self.view.bounds];
    [content didMoveToParentViewController:self];



//remove child controller from container
- (void)hideContentController:(UIViewController *)content animated:(BOOL)animated

    [content willMoveToParentViewController:nil];
    [content.view removeFromSuperview];
    [content removeFromParentViewController];

【讨论】:

这样你就可以在最后两个方法中自定义你的转场动画了 你如何通过堆栈发送对 rootVC 的引用? 使用委托来这样做【参考方案2】:

UITabBarController 为您提供了该功能。如果你有一个作为你的根视图控制器和两个选项卡,每个选项卡中都有一个导航控制器,那么你基本上就完成了。如果您不想在底部显示选项卡栏,则可以将其隐藏,然后在某些事件之后从代码中触发选项卡切换。这很简单:)

【讨论】:

我没有想到这一点,但你是对的,虽然我确实希望你从视图控制器之间的切换(如翻转和溶解)中获得一些不错的过渡,我很确定你不要从 UITabBarController 获取。

以上是关于在两个 UIViewController 堆栈之间转换的主要内容,如果未能解决你的问题,请参考以下文章

ios导航堆栈中的两个转换/演示文稿

在两个 UIViewController 的视图之间滑动

导航堆栈之前视图之间的协议委托

如何在两个 UIViewcontroller 之间跳转

UITABViewController 中两个 UIViewController 之间的 KVO 机制

关闭在 UINavigationController 堆栈中的 UIViewController 的键盘