0

我有一個故事板應用程序,根視圖控制器是UITableViewController在故事板應用程序中,如何在應用程序中從AppDelegate呈現視圖控制器:didFinishLaunchingWithOptions:?

有時,當我啓動應用程序時,我需要提供一個視圖控制器(不需要筆尖或任何東西)。這是我想做的是:

在我UIApplicationDelegateapplication: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中這段代碼的UITableViewController的第一個視圖控制器的viewDidLoad並不認爲是正確的,因爲我需要在我的AppDelegate創造一些性質只是爲了讓我的第一個視圖控制器構建該視圖。這個邏輯不適合那裏。

什麼是呈現此視圖控制器的正確方法?

+0

爲什麼你需要創建在的appDelegate這些特性,而不是在viewDidLoad中根視圖控制器? – rdelmar

回答

0

一種方法可能是從rootViewController到AppDelegate進行代理回調。

  • 聲明中的UITableViewController一個委託協議,像

    - (void)rootViewHasLoaded; 
    

設置你應用程序委託作爲委託的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

+0

這仍然會使用於顯示地圖的ViewController上的AppDelegate邏輯。 –

+0

這並不完美,但它與我最終做的相似。 –

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; 
} 
相關問題