2016-09-23 2 views
1

Я адаптирую свое приложение к Swift 3, и я столкнулся с этой проблемой. Это работало на Swift 2.2, но теперь оно сломано. moviePlayBackFinished никогда не вызывается. Я попытался добавить наблюдателя несколькими способами, все без успеха.AVPlayerItemDidPlayToEndTime никогда не достигает селектора в Swift 3

NotificationCenter.default.addObserver(self, selector: #selector(self.moviePlayBackFinished(_:)), 
              name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem); 

    NotificationCenter.default.addObserver(self, selector: #selector(moviePlayBackFinished(_:)), 
              name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem); 

    NotificationCenter.default.addObserver(self, selector: #selector(self.moviePlayBackFinished(sender:)), 
              name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem); 

// (...) 

@objc func moviePlayBackFinished(sender : AnyObject) { 
    print("playbackFinished"); 
    let zeroCM : CMTime = CMTime(seconds: 0, preferredTimescale: 1000000000); 
    playerLayer.player?.seek(to: zeroCM); 
} 

@objc func moviePlayBackFinished(_ notification: Notification) { 
    print("playbackFinished"); 
    let zeroCM : CMTime = CMTime(seconds: 0, preferredTimescale: 1000000000); 
    playerLayer.player?.seek(to: zeroCM); 
} 

Любые идеи будут рассмотрены.

Спасибо

ответ

1

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

Чтобы исправить это, я в основном переместил вызов NotificationCenter.default.addObserver на UIViewController и presto, все было решено.

Благодарим всех

+0

Спасибо за этот намек. У меня такая же проблема. – Gondomir

+0

Это неправильный ответ. Это проблема с потоком. В соответствии с быстрой справочной документацией 'AVPlayerItemDidPlayToEndTime',' Important Это уведомление может быть опубликовано в другом потоке, отличном от того, на котором был зарегистрирован наблюдатель .'. Одним из простых исправлений для этого будет использование блочного NSNotificationCenter наблюдения. – Ryan

2

использовать этот код ..

NotificationCenter.default.addObserver(self, selector: #selector(detailViewController.playw), name:NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil) 

playw это имя функции вы должны сделать функцию как

func playw(){ 
//do here whatever you want to do 

    } 

Тем не менее у Вас есть какие-либо проблемы, вы можете спросить меня.

+0

Как сделать ставку на нажатие кнопки «Готово» в AVPlayer. ? Пожалуйста, помогите мне. –

1

Существует несколько возможных причин этой проблемы.

NotificationCenter 
    .default 
    .addObserver(self, 
       selector: #selector(self.moviePlayBackFinished(sender:)), 
       name: .AVPlayerItemDidPlayToEndTime, 
       object: player.currentItem) 

Прежде всего, вы должны установить объект в ноль. AVPlayerItemDidPlayToEndTime уведомление автоматически устанавливает объект на AVPlayerItem, который был достигнут в конце. Если вы измените его вручную, вы не получите уведомления о AVPlayerItemDidPlayToEndTime.

Во-вторых, в соответствии с документацией AVPlayerItemDidPlayToEndTime:

Важно

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

Таким образом, убедитесь, что вы должны проверить уведомление в нужную вам ветку.

Не важно, что вы добавили наблюдателя из UIViewController или AVPlayer подкласса.