【问题标题】:Unable to present a view controller from AppDelegate无法从 AppDelegate 呈现视图控制器
【发布时间】:2016-11-13 06:01:29
【问题描述】:

我需要从应用委托中展示一个视图控制器。

当收到电话通知时,我可以通过分析“didReceiveRemoteNotification”方法中的“userInfo”来决定应该呈现 3 个视图控制器(名为 ForumViewController、BlogViewController 和 NewsViewController)中的哪一个。

但是当我尝试使用情节提要或以下代码呈现适当的视图控制器时:

self.viewController = [[MembersViewController alloc] initWithNibName:@"MembersViewController" bundle:nil];
        self.window.rootViewController = self.viewController;
        [self.window makeKeyAndVisible];

然后,应用程序给出错误“警告:尝试呈现其视图不在窗口层次结构中!”。它也卡在特定的视图控制器上。

请记住,当应用启动时,我尝试呈现的视图控制器不是流程的一部分(流程是 LogoViewController -> SplashViewController -> HomeViewController)。

HomeViewController 和 MembersViewController 本质上是用于公共和私人查看的主菜单页面。在这里,我必须向观众展示一些东西。

【问题讨论】:

  • 你是用storyboard还是xib
  • 我正在使用 1 个故事板

标签: ios iphone push-notification apple-push-notifications uistoryboard


【解决方案1】:

选择-1

使用推送

 UINavigationController *navController = (UINavigationController *)self.window.rootViewController;
MembersViewController *vc = [navController.storyboard instantiateViewControllerWithIdentifier:@"MembersViewController"];

[navController pushViewController:vc animated:YES];

使用现在

MembersViewController *root = (MembersViewController *)self.window.rootViewController;
UIViewController *vc = [root.storyboard instantiateViewControllerWithIdentifier:@"MembersViewController"];

[root presentViewController:vc animated:YES completion:NULL];  

更新

  UIStoryboard *mainstoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
MembersViewController* pvc = [mainstoryboard instantiateViewControllerWithIdentifier:@"MembersViewController"];
[self.window.rootViewController presentViewController:pvc animated:YES completion:NULL];

【讨论】:

  • 但它仍然给出同样的错误,它并没有把我带到我希望呈现的视图控制器
  • 它给出了错误“警告:尝试在 上呈现 ,其视图不在窗口层次结构中!”如果应用程序在后台,那么它只会将应用程序带到前台
  • 它仍然显示错误':警告:尝试在 上呈现 ,其视图不在窗口层次结构中!'并且不会更改视图控制器...
  • 在情节提要中,已将 LogoViewController 勾选为初始视图控制器....这通过 segue 链接到 SplashViewController 并且也通过 segue 链接到 HomeViewController...
【解决方案2】:

从情节提要加载视图控制器:

[self performSelector: @selector(ShowModalViewController) withObject: nil afterDelay: 0];

-(void)ShowModalViewController{
 NSString * storyboardName = @"MainStoryboard"; 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil];
    UIViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"IDENTIFIER_OF_YOUR_VIEWCONTROLLER"];
    [self.window.rootViewController presentViewController:vc animated:YES completion:nil];
}

您的视图控制器的标识符等于您的视图控制器的类名,或者您可以在情节提要的身份检查器中分配的情节提要 ID。

【讨论】:

  • 已经尝试过这个解决方案,但不幸的是仍然给了我同样的警告,并且没有把我带到需要呈现给用户的视图控制器
  • @user2442902 我已经做了一些编辑尝试一下。因为使用 performSelector 选择器直到下一次运行循环才会被调用。所以事情有时间安定下来,你会跳过一个运行循环
猜你喜欢
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多