【问题标题】:Player swift crash app播放器快速崩溃应用程序
【发布时间】:2017-09-05 09:48:42
【问题描述】:

我在我的项目中添加了 Player-swift 来播放视频,但是当我弹出该控制器应用程序时出现以下日志崩溃

由于未捕获的异常“NSRangeException”而终止应用程序,原因: '不能删除该键的观察者 路径“速率”来自,因为它不是 注册为观察者。'

有人知道吗?我用过这个播放器https://github.com/piemonte/Player

提前致谢!

【问题讨论】:

  • 你是否删除了视图中的rate观察者消失
  • @Anbu.Karthik 不,我没有改变任何东西
  • 检查一次你的代码,

标签: ios iphone swift avplayer player-swift


【解决方案1】:

不要忘记取消订阅以观察某些属性。例如,如果您订阅了观察 rate,则删除观察使用

player.removeObserver(observer, forKeyPath: #keyPath(AVPlayer.rate))

【讨论】:

    【解决方案2】:

    第一:检查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 的属性- 合规。某物访问您的“foo”属性并注册为 该属性的观察者,同时也是对象的观察者 这就是房产的当前价值;你改变'foo'的值 不让任何人知道;观察者随后决定停止 观察,获取你的 'foo' 属性,并将自己作为观察者移除 那个物体的。但它不再是它注册的同一个对象 作为观察者...

    【讨论】:

      【解决方案3】:

      以你的 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)
      }
      

      【讨论】:

        猜你喜欢
        • 2016-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多