swiftios8mpmediaplayercontroller

dismissMoviePlayerViewControllerAnimated not working in Swift


There don't seem to be any SO posts on dismissMoviePlayerViewControllerAnimated in Swift so I guess I'll kick things off.

I have a table cell, when you do a long press on it, it displays a video. When the video ends, my goal is to take the user back to the table view. That last piece is the bit that's not working.

Any help here would be greatly appreciated. I've read through the Apple docs and some posts about this in Objective-C. Seems that the answer is to run dismissMoviePlayerViewControllerAnimated, a method on UIViewController but it's not working.

import UIKit
import MediaPlayer

class ViewController: UIViewController {
    var moviePlayer:MPMoviePlayerController!

    @IBOutlet weak var longPressView: UIView!
    let longPressRec = UILongPressGestureRecognizer()

    func longPressedView() {
        playVideo()
    }

    func videoHasFinishedPlaying(notification: NSNotification){
        println("Video finished playing")

        self.dismissMoviePlayerViewControllerAnimated()
        // not returning me to the ViewController
    }

    func playVideo() {
        // get path and url of movie
        let path = NSBundle.mainBundle().pathForResource("IMG_8602", ofType:"MOV")
        let url = NSURL.fileURLWithPath(path!)
        moviePlayer = MPMoviePlayerController(contentURL: url)

        // construct the views
        moviePlayer.view.frame = self.view.bounds
        self.view.addSubview(moviePlayer.view)
        moviePlayer.fullscreen = true

        // remove controls at top and bottom of video
        moviePlayer.controlStyle = MPMovieControlStyle.None

        // add event observer for videoHasFinsihedPlaying
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "videoHasFinishedPlaying:",
        name: MPMoviePlayerPlaybackDidFinishNotification, object: nil)
    }

 override func viewDidLoad() {
        super.viewDidLoad()

        longPressRec.addTarget(self, action: "longPressedView")
        longPressView.addGestureRecognizer(longPressRec)
        longPressView.userInteractionEnabled = true

        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

Solution

  • Your code does not work because you are using MPMoviePlayerController instead of MPMoviePlayerViewController.

    You are calling:

    self.dismissMoviePlayerViewControllerAnimated()
    

    but there is no MPMoviePlayerViewController to dismiss. That's why nothing happens.

    If you prefer to use MPMoviePlayerController (as in the code you posted), after adding manually its view, you also have to manually remove it.