0

我有一个 Storyboard 应用程序,它的根视图控制器是UITableViewController.

有时当我启动应用程序时,我需要提供一个视图控制器(不需要笔尖或任何东西)。这就是我试图做到这一点的方式:

在我的UIApplicationDelegate application:application didFinishLaunchingWithOptions:

SplashViewController * splashViewController = [[SplashViewController alloc] init];
splashViewController.semaphore = semaphore;
[self.window.rootViewController presentViewController:splashViewController animated:NO completion:nil];

问题是,此时它还UITabBarController没有在视图层次结构中,所以我收到了这个警告:

Warning: Attempt to present <SplashViewController: 0xa786a10> on <UITabBarController: 0xb35d830> whose view is not in the window hierarchy!

将此代码从 AppDelegate 移动到viewDidLoad第一个视图控制器的代码UITableViewController并不正确,因为我需要在我的 AppDelegate 中创建一些属性,只是为了让我的第一个视图控制器构建该视图。这个逻辑不适合那里。

呈现这个视图控制器的正确方法是什么?

4

2 回答 2

3

在您可以在此处显示视图控制器之前,窗口必须是关键且可见的。您可以通过执行以下操作来完成此操作:

[self.window makeKeyAndVisible];

所以你的完整代码应该是这样的:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [self.window makeKeyAndVisible];

    SplashViewController * splashViewController = [[SplashViewController alloc] init];
    splashViewController.semaphore = semaphore;
    [self.window.rootViewController presentViewController:viewController animated:NO completion:nil];

    return YES;
}
于 2014-07-29T10:06:08.223 回答
0

一种方法是从你的 rootViewController 到 AppDelegate 的委托回调。

  • 在 UITableViewController 中声明一个委托协议,类似于

    - (void)rootViewHasLoaded;
    

将您的 App Delegate 设置为 UITableViewController 的委托(可以在情节提要中执行此操作)

在 App Delegate 中实现委托方法,并在该方法中放置您的 SplashViewController 代码

- (void)rootViewHasLoaded
{
    SplashViewController * splashViewController = [[SplashViewController alloc] init];
    splashViewController.semaphore = semaphore;
    [self.window.rootViewController presentViewController:splashViewController 
                                                 animated:NO 
                                               completion:nil];
}

从您的 rootViewController / UITableViewController 中的适当位置调用委托方法(可能viewDidLoadviewWillAppear

于 2012-12-28T18:54:25.753 回答