[Objective-C] AppDelegate、rootViewControllerおよびpresentViewController



Answers

window.rootViewControllerのモーダルビューコントローラを提示すると、同じ警告が生成され、効果がないことがあります。 ビューコントローラのそのような階層の例:

  1. [ MYUITableViewController ]( MYUIViewControllerによってモーダルに表示されます)
  2. [ MYUIViewController ](下のUINavigationControllerのrootViewController)
  3. [ UINavigationController ](ルート)

今すぐ呼び出す

[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:[UIViewController new] animated:YES completion:nil];

この正確な警告が表示されます(iOS6と7 Simの両方でテスト済み)

解決策:rootViewControllerを使用する代わりに、それが提示するトップレベルのものを使用します。

    UIViewController *topRootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
    while (topRootViewController.presentedViewController) 
    {
        topRootViewController = topRootViewController.presentedViewController;
    }

    [topRootViewController presentViewController:yourController animated:YES completion:nil];
  • 場合によっては、keyWindowがnil rootViewController(UIAlertViews、iPhoneのUIActionSheetsなどを表示)を持つウィンドウに置き換えられていることがあります。その場合、UIViewのウィンドウプロパティを使用する必要があります。
Question

私はFacebookの統合チュートリアルをやっています。ユーザーが現在の状態の有効なトークンを持っている場合、MainViewViewControllerを表示する必要があります。それ以外の場合は、LoginViewControllerを表示します。

MainViewAppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (FBSession.activeSession.state == FBSessionStateCreatedTokenLoaded) {
        // To-do, show logged in view
    } else {
        // No, display the login page.
        [self showLoginView];
    }
    return YES;
}
- (void)showLoginView
{
    UIStoryboard *mainstoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard"          bundle:nil];
    LoginViewController* loginViewController = [mainstoryboard      instantiateViewControllerWithIdentifier:@"LoginViewController"];
    [self.window.rootViewController presentViewController:loginViewController animated:YES completion:NULL];
}

コンソールエラー:

Warning: Attempt to present <LoginViewController: 0xb492fd0> on <MainViewViewController: 0xb1bd820> whose view is not in the window hierarchy!

私はNavigationControllerを使いたくありません。




スウィフト3: -

let storyboard = UIStoryboard(name: "Login", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "LoginViewController")
window?.makeKeyAndVisible()
window?.rootViewController?.present(viewController, animated: true, completion: nil)