【问题标题】:Swift Avplayer inside tableview cell still playing when dismissing changing controller关闭更改控制器时,tableview 单元格内的 Swift Avplayer 仍在播放
【发布时间】:2018-04-18 22:44:14
【问题描述】:

我在我的 tableview 单元格中配置了一个 avPlayer:

func createPlayer(url: URL) {
    self.playerCell = AVPlayer(url: url)
    self.videoContainerView.playerLayer.bounds = self.videoContainerView.bounds
    self.videoContainerView.playerLayer.videoGravity = .resizeAspectFill
    self.videoContainerView.playerLayer.player = playerCell
     playerCell?.play()
}

当用户点击按钮时调用这个函数

@IBAction func playBtnPressed(_ sender: Any) {
    if let videoUrlString = post?.mediaUrl, let url = URL(string: videoUrlString) {
        createPlayer(url: url)
    }
    playBtn.isHidden = true
}

在我的 tableview 控制器中,只要单元格不再显示,我就可以停止播放器,如下所示:

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexPath) as? VideoCell else {return}
    if cell.playerCell != nil {
        if (cell.playerCell?.rate != 0) && (cell.playerCell?.error == nil) {
            cell.playerCell?.pause()
            cell.playerCell = nil
            cell.playBtn.isHidden = false
        }
    }
}

我的问题是,如果我从 tableview 控制器切换到另一个控制器或关闭控制器,视频仍在播放。 如何停止播放器?

我需要索引路径来识别播放器,所以我无法调用 viewWillDisappear 中的函数。

希望有人能提供帮助,我已经尝试修复此问题 3 天...

谢谢! - - - - - - - - - - - 更新 我试过这样做:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
 guard let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell") as? VideoCell else {return}
    if cell.playerCell != nil {
        if (cell.playerCell?.rate != 0) && (cell.playerCell?.error == nil) {
            cell.playerCell?.pause()
            cell.playerCell = nil
            cell.playBtn.isHidden = false
        }
    }
}

但它不起作用......

【问题讨论】:

  • 实施viewWillDisappear?我不明白你为什么不能使用它。您知道自己拥有哪些细胞,因此只需快速查看所有细胞。 — 您可能还应该担心为什么玩家一直在玩;你的视图控制器有内存泄漏吗?
  • @matt 我写的...在 viewWillDisappear 中我无法获取单元格的 indexPath...所以无法让玩家实际在玩...
  • 不,我不明白。你知道你有什么细胞,所以我看不出问题出在哪里。
  • 每个单元格可能有一个播放器...我尝试在 viewWillDisappear 中实现 pause 方法。没有任何反应。因为我不能使用 tableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexPath ).. 没有 indexPath 它不会删除播放器
  • 我做到了...感到困惑,因为这是我尝试的日子...现在添加如下: for visibleCell in tableView.visibleCells { if let cell = visibleCell as? VideoCell { 然后在里面删除播放器.. 它可以工作... thx

标签: ios swift uitableview avplayer


【解决方案1】:

实现viewWillDisappear 以调用visibleCells 并在它们之间循环寻找VideoCell。每次找到一个,告诉它停止播放,就像在你已有的代码中一样。

【讨论】:

    【解决方案2】:

    更优雅的解决方案是覆盖 func prepareForReuse() 并在那里暂停播放器。删除它可能不是最好的事情,因为从一个单元格到另一个单元格,您可以替换 AVPlayer 实例中的当前项目,例如 avPlayer?.replaceCurrentItem(with: videoPlayerItem)

    【讨论】:

      【解决方案3】:

      这对我有用

      override func viewWillDisappear(_ animated: Bool) {
         
          if let indexPath = self.tableView.indexPathsForVisibleRows {
          for i in indexPath! {
              
              let cell : myCustomCell = self.tableView.cellForRow(at: i) as! MyCustomCell
              
              cell.mmPlayerLayer.player?.pause()
          
          }
        }
      }
      

      【讨论】:

        【解决方案4】:

        你可以使用它,就像 viewWillDisappear 一样

        func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
            guard let cell = cell as? YouTableViewCell else { return }
            DispatchQueue.main.async {
                 cell.videoPlayer.player?.pause()
                 cell.videoPlayer.player = nil
                 cell.videoPlayer.layoutIfNeeded()
           }
        

        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-26
          • 2019-02-11
          • 2015-10-28
          • 1970-01-01
          • 2013-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多