AppDelegate,rootViewController和presentViewController

Bor*_*s-V 39 xcode facebook objective-c ios6 appdelegate

我正在做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];
}
Run Code Online (Sandbox Code Playgroud)

控制台错误:

Warning: Attempt to present <LoginViewController: 0xb492fd0> on <MainViewViewController: 0xb1bd820> whose view is not in the window hierarchy!
Run Code Online (Sandbox Code Playgroud)

我不想使用NavigationController.

小智 135

我遇到过同样的问题.基于这个问题的答案,我[self.window makeKeyAndVisible]刚才添加presentViewController:animated:completion:,并为我修复了它.

在您的情况下,showLoginView成为

- (void)showLoginView
{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    LoginViewController *loginViewController = [storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
    [self.window makeKeyAndVisible];
    [self.window.rootViewController presentViewController:loginViewController animated:YES completion:NULL];
}
Run Code Online (Sandbox Code Playgroud)

  • 有用 !谢谢 !我很抱歉,但我没有足够的声誉来表达你的答案...我希望其他人会这样做;) (2认同)
  • 谢啦!!我花了几个小时才找到这个答案 (2认同)

Ste*_*lov 37

有时从window.rootViewController呈现模态视图控制器可能会产生相同的警告并且无效.此类视图控制器层次结构的示例:

  1. [ MYUITableViewController ](由MYUIViewController以模态方式呈现)
  2. [ MYUIViewController ](下面的UINavigationController的rootViewController)
  3. [ UINavigationController ](root)

现在打电话

[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:[UIViewController new] animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)

会引起这个确切的警告(在iOS6和7 Sim上测试)

解决方案:而不是使用rootViewController - 使用它呈现的顶部:

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

    [topRootViewController presentViewController:yourController animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)
  • 有时keyWindow可能已经被带有nil rootViewController的窗口替换(在iPhone上显示UIAlertViews,UIActionSheets等),在这种情况下你应该使用UIView的window属性.