警告:尝试呈现其视图不在窗口层次结构中的ViewController

Vin*_*der 31 xcode objective-c uiviewcontroller ios

在我的一个应用程序中,我从该application didReceiveLocalNotification方法调用viewController .页面加载成功,但它显示一条警告:

 Warning: Attempt to present <blankPageViewController: 0x1fda5190> on 
 <ViewController: 0x1fd85330> whose view is not in the window hierarchy!
Run Code Online (Sandbox Code Playgroud)

我的代码如下:

 -(void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {

    blankPageViewController *myView = [[blankPageViewController alloc] 
               initWithNibName:@"blankPageViewController" bundle: nil];
    myView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self.viewController presentViewController:myView animated:NO completion:nil];  
}
Run Code Online (Sandbox Code Playgroud)

Vin*_*der 21

最后,我用以下代码解决了这个问题.

-(void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
       self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
       self.blankviewController = [[blankPageViewController alloc] initWithNibName:@"blankPageViewController" bundle:nil];
       self.window.rootViewController = self.blankviewController;
       [self.window makeKeyAndVisible];
}
Run Code Online (Sandbox Code Playgroud)


has*_*ier 15

[self.viewController presentViewController:myView animated:NO completion:nil];  
Run Code Online (Sandbox Code Playgroud)

进入一个功能,例如

- (void)yourNewFunction
{
    [self.viewController presentViewController:myView animated:NO completion:nil];
}
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

[self performSelector:@selector(yourNewFunction) withObject:nil afterDelay:0.0];
Run Code Online (Sandbox Code Playgroud)

这里描述的performSelector:withObject:afterDelay问题是什么,这为什么解决了这个问题?因为在下一次运行循环运行之前不会调用选择器.所以事情有时间安定下来,你将跳过一个运行循环.


βha*_*avḯ 14

根据我的假设,我感觉你正试图myViewself.viewController之前出现self.viewController附加或放置在窗口层次结构中.因此,请确保myViewself.viewController出现/附加到窗口后显示.

为什么模态视图控制器不能在viewDidLoad中显示另一个?

  • 是的......进入viewDidAppear完全为我解决了! (2认同)