【问题标题】:How to stop MPMoviePlayerViewController's automatic dismiss on moviePlaybackDidFinish?如何停止 MPMoviePlayerViewController 在moviePlaybackDidFinish 上的自动关闭?
【发布时间】:2012-11-16 16:30:15
【问题描述】:

通过presentMoviePlayerViewControllerAnimated: 模态呈现的 MPMoviePlayerViewController 在其内容播放完毕时自动关闭。

我已尝试禁用此功能,因为之后我想播放其他内容。但是,即使我使用[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:playerVC.moviePlayer]; 注册到 NSNotificationCenter 并设置了一些其他内容,它仍然会关闭。

如何阻止 MPMoviePlayerViewController 自动关闭?

更新:

澄清一下,这个问题只是关于删除自动解雇,而不是关于处理禁用的“完成”按钮。所选答案反映。这是设计使然,因为我们假设开发人员添加了他们自己的方法来关闭 MPMoviePlayerViewController。但是,@bickster 的回答也涉及“完成”按钮。

【问题讨论】:

    标签: ios mpmovieplayercontroller


    【解决方案1】:

    感谢this blog article 我发现 MPMoviePlayerViewController 在创建时会自动将自身注册到 NSNotificationCenter。您必须先删除此注册,它会自动停止自行关闭。

    // Initialize the movie player view controller with a video URL string
    MPMoviePlayerViewController *playerVC = [[[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:aVideoUrl]] autorelease];
    // Remove the movie player view controller from the "playback did finish" notification observers
    [[NSNotificationCenter defaultCenter] removeObserver:playerVC  name:MPMoviePlayerPlaybackDidFinishNotification object:playerVC.moviePlayer];
    

    【讨论】:

    • 但是,如果我这样做,“完成”按钮将不再起作用,这意味着我无法关闭视频播放器。在 iOS 7 中测试。
    • @MinSoe 问题仅仅是关于自动解除,假设开发人员将安装某种方式来解除播放器本身。但是,@bickster 在下面的回答应该会给您更多的帮助。他也有同样的问题。
    【解决方案2】:

    您可以使用此代码阻止视图控制器自动关闭并在用户单击“完成”按钮时捕获事件,以便您自己关闭视图控制器。

    第 1 步 - 分配一个 MPMoviePlayerViewController

    videoPlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:[[NSURL alloc ]initWithString:[aURL];
    

    第 2 步 - 删除默认的 MPMoviePlayerPlaybackDidFinishNotification 观察者并添加您自己的

    [[NSNotificationCenter defaultCenter] removeObserver:videoPlayer
    name:MPMoviePlayerPlaybackDidFinishNotification object:videoPlayer.moviePlayer];
    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(videoFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:videoPlayer.moviePlayer];
    

    第 3 步 - 展示 viewcontroler

    [self presentMoviePlayerViewControllerAnimated:videoPlayer];
    

    第 4 步 - 添加 videoFinish: 方法

    -(void)videoFinished:(NSNotification*)aNotification{
        int value = [[aNotification.userInfo valueForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey] intValue];
        if (value == MPMovieFinishReasonUserExited) {
            [self dismissMoviePlayerViewControllerAnimated];
        }
    }
    

    【讨论】:

    • 真的很好奇。为什么要在几乎一年前回答的问题上添加另一个几乎重复的答案?
    • 它几乎没有重复。答案对我不起作用。我提供的答案有效并且更完整。自从回答了这个问题后,一定发生了一些变化。我希望我的回答能够为人们节省我花在弄清楚它是如何工作的时间上的时间。希望我的回答能满足你的好奇心。
    • 只是实际的问题只是关于删除实际解雇,这在您的步骤 2 的第一行代码中得到了回答。除了添加您尝试删除的相同功能。
    • 这是一个更好的答案,因为如果您不这样做(至少在 iOS 7 中),那么用户根本无法关闭控制器。使用这种方法,您将获得“您想要的”,因为控制器出现然后一直存在,直到用户明确告诉它离开。如果那不是您想要的,那么,请不要这样做 :)
    • 这是正确的答案 - 让视频播放器停留在屏幕上,直到用户明确按下“完成”。 @bickster,我唯一想要的是您更正第二次 sn-p 中的最后一行 - 您缺少“object:nil];”我认为:)
    【解决方案3】:

    你可以试试这样的。

    当 mpmovieplayercontroller 播放完视频并且您在方法中收到通知时 movieFinishedCallback:implemect

           [playerVC.movieplayer setContentURL:// set the url of the file you want to play here];
    
           [playerVC.moviePlayer play];
    

    希望对你有帮助

    【讨论】:

      【解决方案4】:

      如果我从NSNotificationCenter 中删除MPMoviePlayerPlaybackDidFinishNotification,由于“完成”按钮不再起作用,我将重复模式更改为MPMovieRepeatModeOne。 然后,除了重复视频外,一切正常。

      MPMoviePlayerViewController *playerVC = [[[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:aVideoUrl]] autorelease];
      [playerVC.moviePlayer setRepeatMode:MPMovieRepeatModeOne];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-05
        • 1970-01-01
        • 1970-01-01
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        • 2022-11-22
        • 1970-01-01
        相关资源
        最近更新 更多