2016-01-27 3 views
1

Я чрезвычайно новичок в разработке Swift и iOS, поэтому, пожалуйста, простите мое невежество.Swift AVPlayerItem закрыть, когда закончил

Я пытаюсь, чтобы AVPlayer автоматически закрывался при воспроизведении видео. Я решил приложить прослушиватель «playerDidFinishPlaying» для получения уведомления, но как только я его найду, я не могу найти метод/событие для закрытия контроллера. Я хочу подражать действию нажатия кнопки «Готово».

Вот небольшой фрагмент кода. Надеюсь, этого достаточно. Если нет, то я могу предоставить дополнительную информацию

let destination = segue.destinationViewController as! AVPlayerViewController 
let url = NSURL(string: "video url") 
destination.player = AVPlayer(URL: url!) 
destination.player?.play() 

я добавил следующее уведомление, но опять же, я не уверен, что с ним делать, как только я его ...

NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerDidFinishPlaying:", 
    name: AVPlayerItemDidPlayToEndTimeNotification, 
    object: destination.player!.currentItem) 

func playerDidFinishPlaying(note:NSNotification){ 
    print("finished") 
    // close window/controller 
} 

Наконец, я знаю, что мне нужно будет удалить наблюдателя, но я не уверен, когда и где это сделать. Любая помощь приветствуется.

+3

Вы имеете в виду вы не можете сделать 'dismissViewControllerAnimated (правда, завершение: ноль)' 'внутри playerDidFinishPlaying'? Для удаления наблюдателя вы всегда можете поместить внутри 'deinit {}' – Breek

+0

Довольно точно, это именно то, что я ищу. Благодаря! – twsmale

+1

Я отправлю ответ, и вы можете отметить этот вопрос как ответ :) – Breek

ответ

2

Для того, чтобы «закрыть» контроллер, вы должны позвонить dismissViewControllerAnimated(true, completion: nil)

Поэтому код будет выглядеть следующим образом:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerDidFinishPlaying:", 
    name: AVPlayerItemDidPlayToEndTimeNotification, 
    object: destination.player!.currentItem) 

func playerDidFinishPlaying(note:NSNotification){ 
    print("finished") 
    dismissViewControllerAnimated(true, completion: nil) 
} 

если ваш viewController находится внутри UINavigationController стека, вы также можете сделать:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerDidFinishPlaying:", 
     name: AVPlayerItemDidPlayToEndTimeNotification, 
     object: destination.player!.currentItem) 

func playerDidFinishPlaying(note:NSNotification){ 
    print("finished") 
    navigationController?.popViewControllerAnimated(true) 
} 

И ИЗВЛЕКИТЕ наблюдатель, вы можете сделать в deinit{}:

deinit { 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
} 
+0

Фантастический. Именно то, что я ищу. Благодаря! – twsmale

0

Обновление для SWIFT 3:

Примечания: ViewController где вы играете аудио потребности: AVAudioPlayerDelegate

Кроме того, вам не нужно наблюдатель

class myViewController: UIViewController, AVAudioPlayerDelegate { 

var audioplayer = AVAudioPlayer() 

override func viewDidAppear(_ animated: Bool) { 

if soundsON{ 
     let myFilePathString = Bundle.main.path(forResource: "backgroundSound", ofType: "mp3") 

     if let myFilePathString = myFilePathString 
     { 
      let myFilePathURL = URL(fileURLWithPath: myFilePathString) 

      do{ 
       try audioplayer = AVAudioPlayer(contentsOf: myFilePathURL) 
       audioplayer.delegate = self 
       audioplayer.prepareToPlay() 

       audioplayer.play() 


      }catch{ 
       print("error playing coin sound") 
      } 
     } 
    }  
} 

В этом примере воспроизводится звук в viewDidAppear, и когда он заканчивает он будет вызывать: audioPlayerDidFinishPlaying:

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { 
    //Check if the sound that finishes comes from a certain AVAudioPlayer 
    if player == audioplayer{ 
     print("The sound from -audioplayer- has finished") 
    // If you need to dismiss the VC: 
     dismiss(animated: true, completion: nil) 
    } 
} 
Смежные вопросы