有关窗口层次的警告

我在debugging器中有这样的警告,这是什么意思?

Warning: Attempt to present <RootViewViewController: 0x134ce9c0> on <MovieViewController: 0xa967290> whose view is not in the window hierarchy!

我也使MovieViewController作为Storyboard中的初始视图控制器,我也使用ARC。

注意:这不会出现,当我添加两个[super viewDidLoad]; 1在viewDidLoad最低部分中间,这是错误的。

这里是我的MovieViewController实现:

 - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; NSString *moviePath = [[NSBundle mainBundle] pathForResource:@"gameopening" ofType:@"m4v"]; self.moviePlayer = [AVPlayer playerWithURL:[NSURL fileURLWithPath:moviePath]]; [self.moviePlayer play]; // Create and configure AVPlayerLayer AVPlayerLayer *moviePlayerLayer = [AVPlayerLayer playerLayerWithPlayer:self.moviePlayer]; moviePlayerLayer.bounds = CGRectMake(0, 0, 1024, 768); moviePlayerLayer.position = CGPointMake(515,385); moviePlayerLayer.borderColor = [UIColor clearColor].CGColor; moviePlayerLayer.borderWidth = 3.0; moviePlayerLayer.shadowOffset = CGSizeMake(0, 3); moviePlayerLayer.shadowOpacity = 0.80; // Add perspective transform [self.view.layer addSublayer:moviePlayerLayer]; [self performSelector:@selector(loadingView) withObject:nil afterDelay:33.0]; UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]; tapGesture.numberOfTapsRequired = 1; [self.view addGestureRecognizer:tapGesture]; } - (void)handleTapGesture:(UITapGestureRecognizer *)sender { if (sender.state == UIGestureRecognizerStateEnded) { UIImageView *loadingView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)]; loadingView.image = [UIImage imageNamed:@"Load.png"]; [self.view addSubview:loadingView]; [self performSelector:@selector(mainV) withObject:nil afterDelay:2.0]; } } -(void)loadingView{ UIImageView *loadingView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)]; loadingView.image = [UIImage imageNamed:@"Load.png"]; [self.view addSubview:loadingView]; [self performSelector:@selector(mainV) withObject:nil afterDelay:2.0]; } -(void)mainV { moviePlayer = nil; UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"mainViewController"]; vc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; [self presentViewController:vc animated:YES completion:NULL]; } 

帮助将不胜感激:)

viewDidLoad方法在ViewController的view加载到内存中时调用。 但到那个时候, view还没有在屏幕上(所以它没有被添加为任何其他viewwindowsubview ,也就是说它不在视图层次中)。

您应该等待视图在屏幕上呈现您的MovieViewController 。 移动你的代码在viewDidAppear:方法,而是viewDidLoad ,你应该没问题。

viewDidLayoutSubviews可用于此目的。 它比viewDidAppear早。