首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS快速停止MoviePlayer在视图上的解散

iOS快速停止MoviePlayer在视图上的解散
EN

Stack Overflow用户
提问于 2015-06-06 20:41:08
回答 1查看 1.8K关注 0票数 0

我想从一个网址获取一个视频,并在点击按钮的视图中播放它。

我有一个moviePlayer,它播放一个来自URL的视频。一切看起来不错,但当我点击后或下一个按钮(即改变viewController),视频继续播放(因为我仍然能够听到新屏幕上的音频。

因此,我想在viewDidDismiss上添加moviePlayer.Stop()。它在第一次视图更改时运行良好,但是当我回到moviePlayer视图并单击next时,我在moviePlayer.Stop() (因为电影已经停止)找到了一个零错误。有人能帮我明白怎么做吗?

导入UIKit导入MediaPlayer

类InformationViewController: UIViewController {

代码语言:javascript
复制
@IBOutlet var thumbnailImage: UIImageView!
@IBOutlet var videoPlayerView: UIView!

@IBOutlet var controlBtn: UIButton!

var moviePlayer:MPMoviePlayerController!
var url:NSURL = NSURL(string: "http://jplayer.org/video/m4v/Big_Buck_Bunny_Trailer.m4v")!


override func viewDidLoad() {
    super.viewDidLoad()

}

func videoThumbnailIsAvailable(notification: NSNotification){

    if let player = moviePlayer{
        println("Thumbnail is available")
        NSNotificationCenter.defaultCenter().addObserver(self,
            selector: "videoThumbnailIsAvailable:",
            name: MPMoviePlayerThumbnailImageRequestDidFinishNotification,
            object: nil)
        /* Capture the frame at the third second into the movie */
        let thirdSecondThumbnail = 3.0

        /* We can ask to capture as many frames as we
        want. But for now, we are just asking to capture one frame
        Ask the movie player to capture this frame for us */
        moviePlayer.requestThumbnailImagesAtTimes([thirdSecondThumbnail],
            timeOption: .NearestKeyFrame)

        /* Now get the thumbnail out of the user info dictionary */
        let thumbnail =
        notification.userInfo![MPMoviePlayerThumbnailImageKey] as? UIImage

        if let imageR = thumbnail{

            /* We got the thumbnail image. You can now use it here */
            println("Thumbnail image = \(imageR)")
            //println(UIImage(data: imageR))
            thumbnailImage.image = imageR
        }
    }
}

@IBAction func controlBtn(sender: AnyObject) {
    controlBtn.alpha = 0
    moviePlayer = MPMoviePlayerController(contentURL: url)
    let frameWidth = self.videoPlayerView.frame.size.width
    let frameHeight = self.videoPlayerView.frame.size.height

    //moviePlayer.view.frame = CGRect(x: 24, y: 18, width: frameWidth, height: frameHeight)

    self.videoPlayerView.addSubview(moviePlayer.view)


    //     Send button backword
    self.videoPlayerView.sendSubviewToBack(moviePlayer.view)
    moviePlayer.fullscreen = false
    moviePlayer.controlStyle = MPMovieControlStyle.Embedded

    // Pure Visual Format Language style (http://stackoverflow.com/questions/26180822/swift-adding-constraints-programmatically)
    (moviePlayer.view).setTranslatesAutoresizingMaskIntoConstraints(false)
    let views = ["view": videoPlayerView, "videoView": moviePlayer.view]

    var constH = NSLayoutConstraint.constraintsWithVisualFormat("H:[view]-(<=0)-[videoView(\(frameWidth))]", options: .AlignAllCenterY, metrics: nil, views: views)
    view.addConstraints(constH)
    var constW = NSLayoutConstraint.constraintsWithVisualFormat("V:[view]-(<=0)-[videoView(\(frameHeight))]", options: .AlignAllCenterX, metrics: nil, views: views)
    view.addConstraints(constW)

}

override func viewDidDisappear(animated: Bool) {
        moviePlayer.stop()

}
}

任何帮助都将不胜感激。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-06 20:57:47

从代码中看,您的moviePlayer属性似乎是在调用controlBtn(sender)操作时才定义的,因此,如果您在不首先按该按钮的情况下从该视图控制器导航,那么当视图控制器消失时,moviePlayer将是nil

代码语言:javascript
复制
override func viewDidDisappear(animated: Bool) {
    super.viewDidDisappear(animated)  ///< Don't for get this BTW!

    if let player = self.moviePlayer {
        player.stop()
    }
}

此外,您的moviePlayer属性应该是可选的,而不是隐式未包装的可选的。这就是选项赛的意义所在--它们能阻止你犯这些错误,也不会发生像你所经历的那样的崩溃。

代码语言:javascript
复制
var moviePlayer: MPMoviePlayerController?
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30687380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档