未调用MPMoviePlayerPlaybackDidFinishNotification

时间:2011-05-06 09:03:52

标签: iphone ios4 notifications mpmovieplayercontroller

在我的代码中,在点击TopBar上的nextbutton和backButton时,不会调用pl​​ayerPlayBackDidFinish。但是当完整播放视频文件时会调用它,如果有人知道请帮助...

我的代码如下。

#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];
    goingNextButton.title=@"Next";
    goingNextButton.target=self;
    goingNextButton.action=@selector(nextAction);
    self.navigationItem.rightBarButtonItem=goingNextButton;
    [goingNextButton release];

    goingBackButton =[[UIBarButtonItem alloc] init];
    goingBackButton.title=@"Back";
    goingBackButton.target=self;
    goingBackButton.action=@selector(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

2 个答案:

答案 0 :(得分:4)

你读过这个吗?

  

MPMoviePlayerPlaybackDidFinishNotification

     

通知观察者该电影   玩完了。受影响的电影   玩家存储在对象中   通知的参数。该   userInfo字典   通知包含   MPMoviePlayerPlaybackDidFinishReasonUserInfoKey   键,表示原因   播放完毕。这个通知   播放失败时也会发送   因为错误。

     

在案件中不发送此通知   电影播放器​​正在显示的位置   在全屏模式下,用户点按   完成按钮。在那种情况下,   完成按钮可以播放电影   播放器转出时暂停   全屏模式。如果你想   您可以在代码中检测到这种情况   应监控其他通知   如   MPMoviePlayerDidExitFullscreenNotification。

确保您没有做任何未发送此通知的内容

答案 1 :(得分: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];
    }