2011-05-06 63 views
1

在我的代码中,在单击TopBar上的nextbutton和backButton时,不会调用pl​​ayerPlayBackDidFinish。但它被称为当视频文件播放完成后,请帮助,如果有人知道...MPMoviePlayerPlaybackDidFinishNotification未被调用

我的代码如下。

#import "seq_nineViewController.h" 

@implementation seq_nineViewController 

@synthesize ninethVideoController, Bean; 
@synthesize localBackFlag; 
@synthesize goingNextButton, goingBackButton; 

- (void) viewWillAppear:(BOOL)animated { 

     //[super viewWillAppear]; 
    appDelegate = (wishstix_appAppDelegate *) [[UIApplication sharedApplication] delegate]; 
    appDelegate.backFlag = 0; 
    self.localBackFlag = 0; 

    self.navigationController.navigationBarHidden = NO; 
    self.navigationItem.hidesBackButton = YES; 

    goingNextButton =[[UIBarButtonItem alloc] init]; 
    [email protected]"Next"; 
    goingNextButton.target=self; 
    [email protected](nextAction); 
    self.navigationItem.rightBarButtonItem=goingNextButton; 
    [goingNextButton release]; 

    goingBackButton =[[UIBarButtonItem alloc] init]; 
    [email protected]"Back"; 
    goingBackButton.target=self; 
    [email protected](backAction); 
    self.navigationItem.leftBarButtonItem=goingBackButton; 
    [goingBackButton release]; 


    NSEnumerator *AplicationEnumerator = [[appDelegate.categoryDictionary objectForKey:[appDelegate.categoryArray objectAtIndex:appDelegate.categoryRowId]] reverseObjectEnumerator]; 
    NSArray *array = [AplicationEnumerator allObjects]; 
    NSArray *arr = [[NSArray alloc] initWithArray:array]; 

    self.Bean = [arr objectAtIndex:appDelegate.appLicationRowId]; 

    MediaVideoPostUIBean *seq9_asset = [[[self.Bean aplicationFlow] arrayOfMediaVideoPostUI]objectAtIndex:2]; 

    if ([[seq9_asset skip] isEqualToString:skipValueFalse]) { 
     NSMutableString *url = [[NSMutableString alloc] init]; 
     [url appendString:[appDelegate.rootBean RootFileLocation]]; 
     if (appDelegate.avatarFlag == 1) 
      [url appendString:[seq9_asset srcUrlMale]]; 
     else if (appDelegate.avatarFlag == 2) 
      [url appendString:[seq9_asset srcUrlFemale]]; 

     [appDelegate showActivityViewer]; 
     self.ninethVideoController = [self getVideo:url]; 

     if (self.ninethVideoController == nil) { 
      appDelegate.viewNumber = 15; 
      ControllerClass *temp = [[ControllerClass alloc] init]; 
      [temp changeViewControllers]; 

     } else { 

      self.goingNextButton.enabled = NO; 
      self.goingBackButton.enabled = NO; 

      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ninthMoviePlayerPlaybackDidFinish) name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; // self.ninethVideoController]; 
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ninthPlayerLoadState) name:MPMoviePlayerLoadStateDidChangeNotification object:self.ninethVideoController]; 
      [self.view addSubview:self.ninethVideoController.view]; 
      [self.ninethVideoController play]; 

      [url release]; 

     }  
    } 
    else if ([[seq9_asset skip] isEqualToString:skipValueTrue]) { 
     appDelegate.viewNumber = 15; 
     ControllerClass *temp = [[ControllerClass alloc] init]; 
     [temp changeViewControllers]; 
    } 

} 


- (MPMoviePlayerController*)getVideo:(NSString *)url { 

    NSLog(@"Inside the getVideo of ninthMoviePlayer"); 
    [url retain]; 
    NSURL *fileURL = [NSURL URLWithString:url]; 
    MPMoviePlayerController *moviePlayerController = [[[MPMoviePlayerController alloc] initWithContentURL:fileURL] autorelease]; 
    if (([[UIDevice currentDevice] orientation] == UIInterfaceOrientationLandscapeRight) || ([[UIDevice currentDevice] orientation] == UIInterfaceOrientationLandscapeLeft)) 
     moviePlayerController.view.frame = CGRectMake(0.0, 0.0, 480.0, 280.0); 
    else 
     moviePlayerController.view.frame = CGRectMake(0.0, -35.0, 320.0, 436.0); 
    [url release]; 
    return moviePlayerController; 
} 


- (void) ninthMoviePlayerPlaybackDidFinish { 

    NSLog(@"Inside the ninthPlayerPlaybackDidFinish"); 
    [self.ninethVideoController.view removeFromSuperview]; 
    self.ninethVideoController = nil; 

    if (self.localBackFlag == 1) { 
     [self.navigationController popViewControllerAnimated:YES]; 

    } else { 

    appDelegate.viewNumber = 15; 
    ControllerClass *control = [[ControllerClass alloc] init]; 
    [control changeViewControllers]; 
    } 
} 


- (void) ninthPlayerLoadState{ 

    [appDelegate hideActivityViewer]; 
    self.goingNextButton.enabled = YES; 
    self.goingBackButton.enabled = YES; 
} 


// Override to allow orientations other than the default portrait orientation. 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    if ((interfaceOrientation == UIInterfaceOrientationLandscapeRight) || (interfaceOrientation == UIInterfaceOrientationLandscapeLeft)) { 

     NSLog(@"enterd landscape"); 
     [self.ninethVideoController.view removeFromSuperview]; 
     self.ninethVideoController.view.frame = CGRectMake(0.0, 0.0, 480.0, 280.0); 
     [self.view addSubview:self.ninethVideoController.view]; 

    } else if (interfaceOrientation == UIInterfaceOrientationPortrait) { 

     NSLog(@"entered portrait"); 
     [self.ninethVideoController.view removeFromSuperview]; 
     self.ninethVideoController.view.frame = CGRectMake(0.0, -35.0, 320.0, 436.0); 
     [self.view addSubview:self.ninethVideoController.view]; 

    } else if (interfaceOrientation == UIDeviceOrientationPortraitUpsideDown) { 

     NSLog(@"entered PortraitUpsideDown"); 
     [self.ninethVideoController.view removeFromSuperview]; 
     self.ninethVideoController.view.frame = CGRectMake(0.0, -20.0, 320.0, 436.0); 
     [self.view addSubview:self.ninethVideoController.view]; 

    } 
    return (YES); 

} 


- (IBAction) nextAction { 

    NSLog(@"Inside the nextAction of ninthVideoPlayer"); 
    appDelegate.backFlag = 0; 
    self.localBackFlag = 0; 
    [self.ninethVideoController stop]; 
    NSLog(@"After executing stop statememt"); 
    //[self ninthPlayerPlaybackDidFinish]; 
} 

- (IBAction) backAction { 

    NSLog(@"Inside the backAction of ninthVideoPlayer"); 
    appDelegate.backFlag = 1; 
    self.localBackFlag = 1; 
    //[self.ninethVideoController pause]; 
    [self.ninethVideoController stop]; 
    //[self ninthPlayerPlaybackDidFinish]; 
} 


- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 


- (void)viewDidUnload { 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 


- (void)dealloc { 
    [super dealloc]; 
    self.ninethVideoController = nil; 
} 

@end 
+0

当你在对象中尝试self.ninethVideoController而不是nil时,你是否接到了呼叫? – visakh7 2011-05-06 09:22:07

+0

不......我尝试过,但我不知道接到电话... – 2011-05-06 09:28:16

+0

您是否收到其他通知? – visakh7 2011-05-06 09:28:50

回答

4

难道ü阅读本

MPMoviePlayerPlaybackDidFinishNotification

通知观察者,电影 播放完毕。受影响的电影 播放器存储在通知对象 的参数中。此 通知中的 用户信息字典包含 MPMoviePlayerPlaybackDidFinishReasonUserInfoKey 密钥,该密钥指示 回放完成的原因。由于错误,播放失败 时也会发送此通知 。

该通知那里的电影播放器​​显示在全屏模式下 不在的情况下 发送,用户点击 完成按钮。在这种情况下,当播放器跳出全屏模式的 时, 完成按钮会导致电影播放暂停 。如果你想 在你的代码中检测到这种情况,你应该监视其他通知 ,如 MPMoviePlayerDidExitFullscreenNotification。

确保你没有做任何不发送该通知

+1

当播放器全屏并且用户点击'完成'按钮时,我甚至不会获得'MPMoviePlayerDidExitFullscreenNotification'。 – 2013-09-26 23:39:03

1

观察

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(movieDidExitFullscreen:) 
               name:MPMoviePlayerDidExitFullscreenNotification 
               object:nil]; 

并添加动作

- (IBAction) movieDidExitFullscreen:(NSNotification*)notification 
    { 
     NSLog(@"movieDidExitFullscreen"); 
     [self.moviePlayer stop]; 
     [self.moviePlayer setFullscreen:NO animated:NO]; 
     [self.moviePlayer.view removeFromSuperview]; 
    } 
1

我有类似的问题并发现了这个setti ng MPMoviePlayerController的repeatMode到MPMovieRepeatModeOne停止MPMoviePlayerPlaybackDidFinishNotification的发射,我必须为循环播放视频做些什么。

MPMoviePlayerController *moviePlayer =  [[MPMoviePlayerController alloc] initWithContentURL:video_url]; 
[moviePlayer setRepeatMode:MPMovieRepeatModeOne]; 

当我改变REPEATMODE到MPMovieRepeatModeNone,MPMoviePlayerPlaybackDidFinishNotification被正确地解雇了。