2017-04-06 57 views
2

以下是我尝试通过创建自定义控件来播放视频的代码。表格视图在滚动时在其他单元格中播放视频

单击播放按钮时,表格视图中的视频将播放,但它也会播放当前正在播放视频的单元格中的第三个单元格。

在移动到第三个单元格并单击播放按钮时,它会播放正确的视频,但同一个视频会再次播放两个单元格。

我该如何解决这个问题。任何帮助将不胜感激。

class ViewTableCell: UITableViewCell { 
    var avPlayer: AVPlayer? 
     var avPlayerLayer: AVPlayerLayer? 
     var paused: Bool = false 
     var videoPlayerItem: AVPlayerItem? = nil { 
     didSet { 

      avPlayer?.replaceCurrentItem(with: self.videoPlayerItem) 
     } 
    } 

    var tapAction: ((ViewTableCell) -> Void)? 

    @IBAction func playButtonAction(_ sender: UIButton) { 
     tapAction?(self) 
    } 
func setupMoviePlayer(view:UIView){ 
     self.avPlayer = AVPlayer.init(playerItem: self.videoPlayerItem) 
     avPlayerLayer = AVPlayerLayer(player: avPlayer) 
     avPlayerLayer?.videoGravity = AVLayerVideoGravityResizeAspect 
     avPlayer?.volume = 3 
     avPlayer?.actionAtItemEnd = .none 
     avPlayerLayer?.frame = view.bounds 
     self.backgroundColor = .clear 
     view.layer.insertSublayer(avPlayerLayer!, at: 0) 

     let interval = CMTime(value: 1, timescale: 2) 
     avPlayer?.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main, using :{ (progressTime) in 
      let seconds = CMTimeGetSeconds(progressTime) 

      if let duration = self.avPlayer?.currentItem?.duration{ 
       let durationSeconds = CMTimeGetSeconds(duration) 
       self.videoSlider.value = Float(seconds/durationSeconds) 
      } 
     }) 

    } 

    func stopPlayback(){ 
     self.avPlayer?.pause() 
    } 

    func startPlayback(){ 
     self.avPlayer?.play() 
    } 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     self.setupMoviePlayer(view: videoView) 
     // Initialization code 
    } 
} 

视图控制器类

var cell : TrendViewTableCell? 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    { 
     //MARK CellForRowAt 


     let resusableIdentifier: String = "ViewControllerCell" 
     cell = (tableView.dequeueReusableCell(withIdentifier: resusableIdentifier) as? ViewTableCell) 

     if cell == nil { 
      cell = ViewTableCell(style:UITableViewCellStyle.default, reuseIdentifier: resusableIdentifier) 
     } 

     cell?.videoName.text = ArtistFeeds.sharedInstance.videoFeeds[indexPath.row].videoTitle 
     cell?.tapAction = { (cell) in 

      self.onTapPlayButton(cell) 

     } 
     cell?.playButton.addTarget(self, action: #selector(TrendViewController.onTapPlayButton), for: .touchUpInside) 
     return cell! 
    } 

func onTapPlayButton(_ selectedCell:ViewTableCell){ 

     if let index = self.trendTableView.indexPath(for: selectedCell){ 
      //put your code to execute here 
      let url = Bundle.main.path(forResource:ArtistFeeds.sharedInstance.videoFeeds[index.row].videoUrl, ofType:"mp4") 

      let path = NSURL.fileURL(withPath: url!) 
      let currentCell = tableView.cellForRow(at: index) as! ViewTableCell 
      currentCell.videoPlayerItem = AVPlayerItem.init(url: path) 
      let playImage = UIImage(named: "image_video_play") as UIImage? 
      let pauseImage = UIImage(named: "image_video_pause") as UIImage? 
      if currentCell.avPlayer?.rate == 1.0 { 
       currentCell.stopPlayback() 
       currentCell.playButton.setImage(playImage, for: .normal) 

      } else { 
       currentCell.startPlayback() 
       currentCell.playButton.setImage(pauseImage, for: .normal) 
      } 
     } 
    } 
+0

细胞被重用,所以要添加的自来水处理多次为你滚动。你应该处理单元类中的tap,并通过委托模式或闭包通知tableview控制器; http://stackoverflow.com/questions/28659845/swift-how-to-get-the-indexpath-row-when-a-button-in-a-cell-is-tapped/38941510#38941510 – Paulw11

+0

我已经实施了上面提到的方法。但仍然存在同样的问题。 @ Paulw11 –

回答

0

你的tableview细胞被重用,这就是你面对这样的问题的原因。

使用一些布尔值来管理它,或者每次在cellForRow:delegate时重置视频。

0

在单元初始化之前放置单元格?.playButton.addTarget(self,action:#selector(TrendViewController.onTapPlayButton),用于:.touchUpInside)会更好。

在你的情况,你可以把 “细胞.playButton.addTarget(自我,动作:#selector(TrendViewController.onTapPlayButton)” 这部分是这样的:如果 细胞==零{ 电池= ViewTableCell(风格:UITableViewCellStyle.default,reuseIdentifier:resusableIdentifier) 细胞.playButton.addTarget(自我,动作:#selector(TrendViewController.onTapPlayButton) } 对于我来说,我会覆盖在细胞类启动方法,做在心里

0

您需要实施:

prepareForReuse() 

你的细胞,那么这里面告诉AVPlayerpausereplaceCurrentItemnil或新项目

相关问题