如何使用多个iOS自定义视图控制器而不使用导航控制器

Gar*_*ies 8 iphone uiviewcontroller uiwindow ipad ios

我正在构建一个使用多种类型屏幕的应用程序 - 所有这些都保证了自己的自定义视图控制器.我成功视图控制器,并通过重新分配的主要及其相关视图之间切换windowrootViewController,在我的应用程序代理类似下面的方法:

- (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
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,我这样做的方式似乎不是最好的做法.我也不想使用a UINavigationController或a UITabBarController作为rootViewController.这是否是这样做的错误方式,如果是这样,我应该如何以不同的方式接近它?

我以为这会被覆盖在某个地方,但是(我觉得好像)我用Google搜索了它,找了相关的问题等等.抱歉,如果我错过了什么!

Mr.*_*. T 10

一个很好的方法是使用iOS5 +的UIViewController能够拥有子UIViewControllers(它被称为视图控制器包含).在看WWDC视频详细解释这个问题之前,我当然很难搞清楚如何做到这一点.

简而言之,它允许您创建自己的父视图控制器,该控制器拥有一系列子视图控制器.这个单一父视图控制器可以(并且可能应该,除非你正在做一些非常奇特的东西: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];
Run Code Online (Sandbox Code Playgroud)

然后我将有一个函数来转换到下一个子视图控制器(注意:此函数属于父视图控制器 - 将作为您的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;
                            }];
}
Run Code Online (Sandbox Code Playgroud)

有一点非常好用的是你可以使用所有标准的UIViewAnimationTransition选项(或者在动画块中定义你自己的自定义动画.此外,任何方向旋转事件都会自动从父视图控制器转发到子视图控制器.这是其中之一自己做自定义根视图控制器操作的最毛躁的问题.

我建议你看看WWDC2011的视频,题为"实现UIViewController遏制".


Rui*_*res 3

这不是一个糟糕的解决方案。您基本上将一个视图设置为根视图。当您需要另一个 UIViewController 时,您可以设置另一个。只是要小心漏水...

  • 使用保留创建 rootViewController 作为类的属性。
  • 在这之前:

rootViewController = (UIViewController *)[[BookViewController alloc] init];

添加这个:

if(rootViewController){
    self.rootViewController=nil;
}
Run Code Online (Sandbox Code Playgroud)

}

所以你释放了前一个。

编辑 1:有一件事:我在这里的解释是基于您不想使用 UINavigationController 的事实。

  • 嗯......接受一个基本上说“你已经在做的事情很好......虽然有更好的解决方案,但我不会告诉你它是什么......的答案总是感觉很奇怪...... ” (2认同)