AVPlayerItemDidPlayToEndTime 永远不会到达 Swift 上的选择器 3
AVPlayerItemDidPlayToEndTime never reaches selector on Swift 3
我正在调整我的应用程序以适应 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);
}
任何想法都会被采纳。
谢谢
使用此代码..
NotificationCenter.default.addObserver(self, selector: #selector(detailViewController.playw), name:NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
playw 是函数名,你必须使函数像
func playw(){
//do here whatever you want to do
}
还有什么问题可以问我
好的,问题是我试图从包含视频的子类中添加观察者,而不是从包含视频视图的 ViewController 添加它。
因此,为了解决这个问题,我基本上将 NotificationCenter.default.addObserver 调用移到了 UIViewController 上,很快就解决了。
谢谢大家
这个问题有多种可能的原因。
NotificationCenter
.default
.addObserver(self,
selector: #selector(self.moviePlayBackFinished(sender:)),
name: .AVPlayerItemDidPlayToEndTime,
object: player.currentItem)
首先,您必须将对象设置为零。 AVPlayerItemDidPlayToEndTime
通知自动将对象设置为到达末尾的 AVPlayerItem
。如果您手动更改它,您将不会收到任何 AVPlayerItemDidPlayToEndTime
.
的通知
其次,根据 AVPlayerItemDidPlayToEndTime
文档:
Important
This notification may be posted on a different thread than the one on which the observer was registered.
所以,为了确保您应该检查通知是否在您想要的线程上。
从 UIViewController
或 AVPlayer
子类添加观察者并不重要。
Ryan 是对的!
从 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?)
我正在调整我的应用程序以适应 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);
}
任何想法都会被采纳。
谢谢
使用此代码..
NotificationCenter.default.addObserver(self, selector: #selector(detailViewController.playw), name:NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
playw 是函数名,你必须使函数像
func playw(){
//do here whatever you want to do
}
还有什么问题可以问我
好的,问题是我试图从包含视频的子类中添加观察者,而不是从包含视频视图的 ViewController 添加它。
因此,为了解决这个问题,我基本上将 NotificationCenter.default.addObserver 调用移到了 UIViewController 上,很快就解决了。
谢谢大家
这个问题有多种可能的原因。
NotificationCenter
.default
.addObserver(self,
selector: #selector(self.moviePlayBackFinished(sender:)),
name: .AVPlayerItemDidPlayToEndTime,
object: player.currentItem)
首先,您必须将对象设置为零。 AVPlayerItemDidPlayToEndTime
通知自动将对象设置为到达末尾的 AVPlayerItem
。如果您手动更改它,您将不会收到任何 AVPlayerItemDidPlayToEndTime
.
其次,根据 AVPlayerItemDidPlayToEndTime
文档:
Important
This notification may be posted on a different thread than the one on which the observer was registered.
所以,为了确保您应该检查通知是否在您想要的线程上。
从 UIViewController
或 AVPlayer
子类添加观察者并不重要。
Ryan 是对的!
从 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?)