我已经在我的项目中添加了Player-swift来播放视频但是当我弹出控制器应用程序时会跟随日志崩溃
由于未捕获的异常'NSRangeException'而终止应用程序,原因: '无法移除密钥的观察者 路径“速率”因为它不是 注册为观察员。'
任何人都有任何想法?我使用过这个玩家https://github.com/piemonte/Player
提前致谢!
答案 0 :(得分:0)
不要忘记取消观察某些财产。例如,如果您订阅观察rate
,那么删除观察使用
player.removeObserver(observer, forKeyPath: #keyPath(AVPlayer.rate))
答案 1 :(得分:0)
首先:检查KVO basics 第二:在Objective-C中,您可以将观察者代码移除到try-catch块中并且过得开心。苹果指南也是这样说的:
如果尚未注册为观察员,则要求作为观察者删除 导致NSRangeException。你要么打电话 removeObserver:forKeyPath:context:对应的一次 调用addObserver:forKeyPath:options:context:,或者如果不是 在你的应用程序中可行,放置removeObserver:forKeyPath:context: 调用try / catch块来处理潜在的异常。
在swift中,没有KVO API调用可以询问,“X是否观察到对象Z的关键路径Y?”There是解决它的一些方法。
check删除观察者时崩溃的原因之一。这是引用:
“它”是指观察者。 -removeObserver:forKeyPath:引发这个 如果被告知要删除当前未注册的对象,则为异常 作为观察者。所以正在发生的是表视图正在尝试 取消注册来自你的一个对象的观察者 遗憾的是,他之前没有注册成为观察员。
通常的原因是你的财产不是KVO- 兼容。 Something访问你的'foo'属性并注册为 该属性的观察者,也是该对象的观察者 这是该物业的现值;你改变'foo'的值 不让任何人知道;然后观察者决定停止 观察,获取你的'foo'属性,并以观察者身份移除自己 那个对象。但它不再是它注册的同一个对象 作为...的观察员。
答案 2 :(得分:0)
以你的UIView的IBOutlet为例
@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)
}