我在我的项目中增加了播放视频的播放器-斯威夫特,但是当我弹出那个控制器应用程序时,它会与下面的日志崩溃。
由于NSRangeException异常而终止应用程序,原因是:“无法删除键路径的观察者”速率“,因为它没有注册为观察者。”
有人知道吗?我用过这个播放器https://github.com/piemonte/Player
提前谢谢!
发布于 2017-09-07 08:52:13
不要忘了从观察某些财产中排除危险。例如,如果您订阅了观察rate,那么就删除观察使用
player.removeObserver(observer, forKeyPath: #keyPath(AVPlayer.rate))发布于 2018-05-21 12:32:33
First:检查KVO基础。
第二:在objective中,您可以将观察者代码移除到try-块中,并使生活愉快。苹果的导游也是这么说的:
请求作为观察员被移除,如果还没有注册为NSRangeException的话。对于相应的add观察者调用:forKeyPath:options:context:,或者如果在您的应用程序中不可行,则在应用程序中调用Remove观察者:forKeyPath:context: call,以便处理潜在的异常。
在迅捷中,没有KVO调用,您可以问,“X在观察对象Z的关键路径Y吗?”https://stackoverflow.com/a/37819004/5790492是一些解决方法。
也是删除观察者时崩溃的原因之一-- 检查。以下是这段话:
"It“指的是观察员。-removeObserver:forKeyPath:如果被告知要删除当前未注册为观察者的对象,则会引发此异常。所以正在发生的事情是,一个表视图试图从你的一个对象中注销一个观察者,不幸的是,它之前并没有注册为观察者。 造成这种情况的通常原因是,您有一个不兼容KVO的属性。某物访问您的'foo‘属性并注册为该属性的观察者,并且注册为该属性当前值的对象的观察者;您更改'foo’的值而不让任何人知道;观察者随后决定停止观察,获取'foo‘属性,并将其作为该对象的观察者移除。但它不再是它注册为观察员的那个物体了.
发布于 2018-05-21 12:41:22
以IBOutlet of Your UIView为例
@IBOutlet var videoView:UIView!
var player:AVPlayer!
func buttonPressed()
{
let videoURL = URL(fileURLWithPath: "your File Path")
player = AVPlayer(url: videoURL)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.videoGravity = .resizeAspect
playerLayer.frame = videoView.bounds
videoView.layer.addSublayer(playerLayer)
player.play()
player.actionAtItemEnd = .none
NotificationCenter.default.addObserver(self, selector: #selector(self.playerItemDidReachEnd(_:));, name: .AVPlayerItemDidPlayToEndTime, object: player.currentItem)
}
@objc func playerItemDidReachEnd(_ notification: Notification?)
{
let p = notification?.object as? AVPlayerItem
p?.seek(to: kCMTimeZero)
}
override func viewWillDisappear(_ animated: Bool)
{
NotificationCenter.default.removeObserver(self, name: .AVPlayerItemDidPlayToEndTime, object: player.currentItem)
}https://stackoverflow.com/questions/46051945
复制相似问题