iphone - 如何在没有导航 Controller 的情况下使用多个 iOS 自定义 View Controller

标签 iphone ios ipad uiviewcontroller uiwindow

我正在构建一个使用多种类型屏幕的应用程序——所有这些屏幕都保证有自己的自定义 View Controller 。通过使用我的应用程序委托(delegate)中的方法重新分配主 windowrootViewController,我成功地在 View Controller 及其相关 View 之间切换,如下所示:

- (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
    }
}

然而,我这样做的方式似乎不能成为最佳实践。我也不想使用 UINavigationControllerUITabBarController 作为 rootViewController。这是执行此操作的错误方法吗?如果是这样,我应该如何以不同的方式处理此问题?

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

最佳答案

实现此目的的一种好方法是使用 iOS5+ 的 UIViewController 拥有子 UIViewController 的能力(称为 View Controller 包含)。在我观看了详细解释这一点的 WWDC 视频之前,我当然很难弄清楚如何做到这一点。

简而言之,它允许您创建自己的拥有一系列 subview Controller 的父 View Controller 。这个单一的父 View Controller 可以(并且可能应该,除非你正在做一些非常奇特的事情:P)作为你的应用程序窗口的 Root View Controller 。这种让单个 View Controller 充当父 View Controller (并促进 subview Controller 的添加、删除和转换)的方法让人想起 UINavigationController 所做的事情(这是 Apple 的意图)。现在您可以创建自己的 UINavigationController 类父 View Controller ,但具有完全不同的过渡动画和 UI。

例如,在父 View Controller 中,在 viewDidLoad 中,我像这样添加第一个子 Controller :

self.currentlyDisplayedChildViewController = [[TheFirstViewController alloc] init];
[self addChildViewController:self.currentlyDisplayedChildViewController];
[self.view addSubview:self.currentlyDisplayedChildViewController.view];
[self.currentlyDisplayedChildViewController didMoveToParentViewController:self];

然后我会有一个函数来转换到下一个 subview Controller (注意:这个函数属于父 View Controller ——将充当您的 UINavigationController 的 View Controller ) :

- (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 选项(或在动画 block 中定义您自己的自定义动画。此外,任何方向旋转事件都会自动从父 View Controller 转发到 subview Controller 。这是自己进行自定义 Root View Controller 操作时最棘手的问题之一。

我建议您观看名为“实现 UIViewController 遏制”的 WWDC2011 视频。

关于iphone - 如何在没有导航 Controller 的情况下使用多个 iOS 自定义 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6817213/

相关文章:

iphone - CATransaction是立即的并且忽略过渡时间

iphone - 如何让xCode项目中的启动画面持续时间更长?

Android listView 作为 iPhone 的 listView

iphone - 读取音频文件而不播放

ios - 单击后退按钮时,导航堆栈中 VC 的 UINavigationBar 标题颜色不会更改

ios - 什么需要在主线程上?

objective-c - UIWebView可以播放本地视频吗?

ipad - CSV 文件下载到 iPad

ios - Facebook 登录 Swift iOS 10 - 没有任何效果

ios - Swift 应用程序在 Ipad 上启动时崩溃......而不是在模拟器中