dismissViewControllerAnimated导致相同的视图控制器再次加载

时间:2014-03-11 19:50:21

标签: ios cocoa ios7

我的方案如下:

  1. 当应用程序加载时,第一个控制器为A
  2. 第一次启动应用程序时,它会加载显示视频的控制器B. A在其performSegueWithIdentifier方法中使用viewDidAppear加载B.乙
  3. B使用MPMoviePlayerViewController显示视频。 B识别出视频使用MPMoviePlayerPlaybackDidFinishNotification完成,然后执行:
    [self dismissViewControllerAnimated:NO completion:nil];
  4. 解雇调用导致B重新加载(电影再次播放)并且控制台中出现以下错误:

      

    :CGImageCreate:图片大小无效:0 x 0。

    我如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

问题在于你的逻辑在ViewController A的viewDidAppear:方法中呈现ViewController B.

当B完成并解散时,A的viewDidAppear:将再次被调用,这将再次呈现B并且循环将继续直到某些东西腐烂。

基本上:

  1. viewDidLoad的A
  2. viewDidAppear:的A
  3. B介绍
  4. B解雇
  5. viewDidAppear:的A
  6. B介绍
    ...
  7. 你应该重新思考你的逻辑,因为在这一点上,有很多方法可以解决这个问题。

    或者......如果这部电影必须只播放一次,那么你可以在A的viewDidLoad中呈现B.

答案 1 :(得分:1)

dismissViewControllerAnimated的调用将导致在第一个视图控制器A上再次调用viewDidAppear

但您可以使用方法- (BOOL)[UIViewController isBeingPresented]区分第一次开始显示此视图控制器。

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];

  if ([self isBeingPresented]) {
    [self performSegueWithIdentifier:@"YourSegueIdentifier" sender:self];
  }
}

答案 2 :(得分:0)

我会设置一个像didMoviePlay这样的属性,然后在viewDidAppear:中检查是否播放了该电影。这样,如果电影播放出错,您可以决定如何从那里开始。