在两个 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 堆栈之间转换的主要内容,如果未能解决你的问题,请参考以下文章