AVPlayerItemDidPlayToEndTime永远不会到达Swift 3上的选择器

时间:2016-09-23 20:26:14

标签: swift avplayer swift3

我正在将我的应用改编为Swift 3,而且我遇到了这个问题。这曾经在Swift 2.2上运行,但现在已经坏了。 moviePlayBackFinished永远不会被调用。我尝试以多种方式添加观察者,但都没有成功。

    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);
}

任何想法都会得到满足。

谢谢

4 个答案:

答案 0 :(得分:5)

此问题有多种可能原因。

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

首先,你必须将对象设置为nil。 AVPlayerItemDidPlayToEndTime通知自动将对象设置为最后到达的AVPlayerItem。如果您手动更改,则不会收到AVPlayerItemDidPlayToEndTime的任何通知。

其次,根据AVPlayerItemDidPlayToEndTime文档:

  

重要

     

此通知可以发布在与注册观察者的线程不同的线程上。

因此,要确保您应该检查通知是否在您想要的主题上。

你添加来自UIViewControllerAVPlayer子类的观察者并不重要。

答案 1 :(得分: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

    }

你还有什么问题可以问我。

答案 2 :(得分:1)

瑞安是对的!

无论您是从UIViewController还是AVPlayer子类进行观察,都没关系。

只需使用

addObserver(forName name: NSNotification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void)

代替

addObserver(_ observer: Any, selector aSelector: Selector, name aName: NSNotification.Name?, object anObject: Any?)

答案 3 :(得分:0)

好的,所以问题是我试图从包含视频的子类添加观察者,而不是从包含视频视图的ViewController添加它。

为了解决这个问题,我基本上将NotificationCenter.default.addObserver调用移动到UIViewController和presto,全部解决了。

谢谢大家