如何使用多个iOS自定义视图控制器而不使用导航控制器
我正在构建一个使用多种类型屏幕的应用程序 – 所有这些都保证了自己的自定义视图控制器。 我通过在我的应用委托中重新分配主window
的rootViewController
方法,成功地在视图控制器及其相关视图之间切换,如下所示:
- (void)changeRootViewController:(NSString *)controllerName { if (controllerName == @"book") { rootViewController = (UIViewController *)[[BookViewController alloc] init]; [self.window setRootViewController:rootViewController]; } else if (controllerName == @"something_else") { // Use a different VC as roowViewController } }
然而,我这样做的方式似乎不是最好的做法。 我也不想使用UINavigationController
或UITabBarController
作为rootViewController
。 这是否是这样做的错误方式,如果是这样,我应该如何以不同的方式接近它?
我以为这会被覆盖在某个地方,但是(我觉得好像)我用Google搜索了它,找了相关的问题等等。抱歉,如果我错过了什么!
这不是一个坏的解决方案。 您基本上将一个视图设置为根视图。 当你需要另一个UIViewController时,你设置另一个。 小心泄漏……
- 使用retain创建rootViewController作为类的属性。
- 在这之前:
rootViewController =(UIViewController *)[[BookViewController alloc] init];
添加这个:
if(rootViewController){ self.rootViewController=nil; }
}
所以你发布了前一个。
编辑1:有一件事:我在这里的解释是基于你不想使用UINavigationController的事实。
一个很好的方法是使用iOS5 +的UIViewController能够拥有子UIViewControllers(它被称为视图控制器包含)。 在我观看WWDCvideo详细解释这一点之前,我当然很难搞清楚如何做到这一点。
简而言之,它允许您创建自己的父视图控制器,该控制器拥有一系列子视图控制器。 这个单一父视图控制器可以(并且可能应该,除非你正在做一些非常奇特的东西:P)作为你的应用程序窗口的根视图控制器。 这种让单个视图控制器充当父视图(并且便于添加,删除和转换子视图控制器)的方法让人联想到UINavigationController的作用(这是Apple的意图)。 现在您可以创建自己的UINavigationController类父视图控制器,但具有完全不同的过渡动画和UI。
例如,在父视图控制器中,在viewDidLoad中,我添加第一个子控制器,如下所示:
self.currentlyDisplayedChildViewController = [[TheFirstViewController alloc] init]; [self addChildViewController:self.currentlyDisplayedChildViewController]; [self.view addSubview:self.currentlyDisplayedChildViewController.view]; [self.currentlyDisplayedChildViewController didMoveToParentViewController:self];
然后我将有一个函数来转换到下一个子视图控制器(注意:此函数属于父视图控制器 – 将作为您的UINavigationController的视图控制器) :
- (void)transitionToViewController:(UIViewController *)nextChildViewController { [self addChildViewController:nextChildViewController]; __weak TheParentViewController *me = self; [self transitionFromViewController:self.currentlyDisplayedChildViewController toViewController:nextChildViewController duration:1.0f options:UIViewAnimationOptionTransitionFlipFromLeft animations:nil completion:^(BOOL finished) { [nextChildViewController didMoveToParentViewController:self]; [me.currentlyDisplayedChildViewController willMoveToParentViewController:nil]; [me.currentlyDisplayedChildViewController removeFromParentViewController]; me.currentlyDisplayedChildViewController = nextChildViewController; }]; }
有一点非常好用的是你可以使用所有标准的UIViewAnimationTransition选项(或者在动画块中定义你自己的自定义动画。此外,任何方向旋转事件都会自动从父视图控制器转发到子视图控制器。这是其中之一自己做自定义根视图控制器操作的最毛躁的问题。
我建议你看看WWDC2011的video,题为“实现UIViewController遏制”。