玩家迅速崩溃的应用程序

时间:2017-09-05 09:48:42

标签: ios iphone swift avplayer player-swift

我已经在我的项目中添加了Player-swift来播放视频但是当我弹出控制器应用程序时会跟随日志崩溃

  

由于未捕获的异常'NSRangeException'而终止应用程序,原因:   '无法移除密钥的观察者   路径“速率”因为它不是   注册为观察员。'

任何人都有任何想法?我使用过这个玩家https://github.com/piemonte/Player

提前致谢!

3 个答案:

答案 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)
}