如何让button显示不同的video按照它被按下的行?

目前我有我的代码安装到每个表格视图单元格中有一个button,按下后显示一个video。 每个表格视图的单元格行都包含button(有x个单元格),但是无论按下哪个行的button都会导致相同的video。 有什么方法可以让你在哪里,取决于button所在的行,它显示一个video? 我的代码目前只有一个video文件,但是我怎样才能让它在哪里取决于单元格的button被点击,它显示一个特定的video? 例如,如果在第一行中点击button,我希望它显示某个video,而对于两个和三个等等,则是相同的。 现在他们都显示相同的video。

这是我的表格视图单元的代码:

import UIKit import AVFoundation import AVKit class VideoPlayerView: UIView { let pauseButton: UIButton = { let button = UIButton(type: .system) button.setImage(#imageLiteral(resourceName: "Triangle 2"), for: .normal) button.translatesAutoresizingMaskIntoConstraints = false button.tintColor = UIColor.white button.isHidden = false button.addTarget(self, action: #selector(handlePause), for: .touchUpInside) return button }() var player: AVPlayer? var isPlaying = false func handlePause() { if isPlaying { player?.pause() pauseButton.alpha = 1.0 } else { player?.play() pauseButton.alpha = 0.01 } isPlaying = !isPlaying } //container view that holds sublayers for the video control objects let controlsContainerView: UIView = { let view = UIView() view.backgroundColor = UIColor(white: 0, alpha: 1.0) return view }() required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override init(frame: CGRect) { super.init(frame: frame) //setupPlayerView() //configures container view (video's background) controlsContainerView.frame = frame addSubview(controlsContainerView) backgroundColor = UIColor.black //following adds pause/play button to video controlsContainerView.addSubview(pauseButton) pauseButton.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true pauseButton.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true } //function that sets up video playback private func setupPlayerView() { //variable that contains video url let fileUrl = URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BlackHeartBB/dunk.mov") player = AVPlayer(url: fileUrl) //video only renders if you specify 'playerLayer' let playerLayer = AVPlayerLayer(player: player) self.layer.insertSublayer(playerLayer, at: 1) playerLayer.frame = frame player?.play() //attached obeserver of 'player' to tell when 'player' is ready player?.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil) } //method called every time you add obserever to an object override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { //strring that lets AVPlayer know its ready if keyPath == "currentItem.loadedTimeRanges" { //configures container view while video is playing controlsContainerView.backgroundColor = UIColor.clear pauseButton.alpha = 0.05 isPlaying = true } } } 

 class DrillsTableViewCell: UITableViewCell { var videoURL:[URL] = [URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BlackHeartBB/dunk.mov"), URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BlackHeartBB/mk.MOV")] var video = URL(fileURLWithPath: String()) @IBOutlet weak var logoImage: UIImageView! @IBOutlet weak var drillTitle: UILabel! @IBOutlet weak var playButton: UIButton! @IBAction func watchButton(_ sender: Any) { print(123) //controls video background view if let keyWindow = UIApplication.shared.keyWindow { let view = UIView(frame: keyWindow.frame) view.backgroundColor = UIColor.white view.frame = CGRect(x: 0.0, y: 0.0, width: keyWindow.frame.width, height: keyWindow.frame.height) let videoPlayerFrame = CGRect(x: 0, y: 0, width: keyWindow.frame.width, height: keyWindow.frame.width * 9 / 16) let videoPlayerView = VideoPlayerView(frame: videoPlayerFrame) view.addSubview(videoPlayerView) keyWindow.addSubview(view) UIView.animate( withDuration: 0.5, delay: 0, options: .curveEaseOut, animations: { view.frame = keyWindow.frame }, completion: { completedAnimation in //possible features implemented later UIApplication.shared.isStatusBarHidden = true } ) } } } 

表视图代码:

 class DrillsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { var arrayForKey2 = [[String]]() var keyIndex = Int() var headLabel = String() var labels = Array(trainingDict.keys) @IBOutlet weak var tableView: DrillsTableView! @IBOutlet weak var drillLabel: UILabel! @IBOutlet weak var labelBackground: UIView! @IBAction func back(_ sender: Any) { performSegue(withIdentifier: "back", sender: self) } public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return arrayForKey2.count } func numberOfSections(in tableView: UITableView) -> Int { return 1 } public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell" , for: indexPath) as! DrillsTableViewCell cell.playButton.tag = indexPath.row //clear background color needed in order to display gradient cell cell.backgroundColor = UIColor.clear //gradient configuration gradient = CAGradientLayer() gradient.frame = tableView.bounds gradient.colors = [UIColor.black.cgColor, UIColor.darkGray.cgColor, UIColor.black.cgColor] tableView.layer.insertSublayer(gradient, at: 0) gradient.startPoint = CGPoint(x: 0.0, y: 0.0) gradient.endPoint = CGPoint(x: 1.0, y: 1.0) //Possible method for 'drillLabel' gradient drillLabel.font = UIFont(name: "Symbol", size: 24.0) //attributes for watch/play button cell.playButton.layer.shadowColor = UIColor.black.cgColor cell.playButton.layer.shadowOffset = CGSize(width: 2, height: 2) cell.playButton.layer.shadowOpacity = 0.7 cell.playButton.layer.shadowRadius = 1 //details for cell label display cell.borderWidth = 1.5 cell.borderColor = UIColor.white cell.drillTitle.text = "\(arrayForKey2[keyIndex][indexPath.row])" cell.drillTitle.font = UIFont(name: "Symbol", size: 18.0) cell.drillTitle.textColor = UIColor.white return cell } override func viewDidLoad() { super.viewDidLoad() tableView.delegate = self tableView.dataSource = self drillLabel.text = labels[keyIndex] } } 

我相信你应该重构你的代码来获得所需的行为。 请检查以下代码:

首先在名为setupPlayerView VideoPlayerView方法中进行更改。使用以下setupPlayerView您的实现:

 func setupPlayerView(for url: URL) { player = AVPlayer(url: url) //video only renders if you specify 'playerLayer' let playerLayer = AVPlayerLayer(player: player) self.layer.insertSublayer(playerLayer, at: 1) playerLayer.frame = frame player?.play() //attached obeserver of 'player' to tell when 'player' is ready player?.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil) } 

现在在DrillsTableViewCell中进行更改,在DrillsTableViewCell中进行更改,然后添加一个新variablessingleVideoURL,您的新类将如下所示:

 class DrillsTableViewCell: UITableViewCell { var videoURLs:[URL] = [URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BlackHeartBB/dunk.mov"), URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BlackHeartBB/mk.MOV")] @IBOutlet weak var logoImage: UIImageView! @IBOutlet weak var drillTitle: UILabel! @IBOutlet weak var playButton: UIButton! @IBAction func watchButton(_ sender: UIButton) { print(123) //controls video background view if let keyWindow = UIApplication.shared.keyWindow { let view = UIView(frame: keyWindow.frame) view.backgroundColor = UIColor.white var singleVideoURL = videoURLs[sender.tag] view.frame = CGRect(x: 0.0, y: 0.0, width: keyWindow.frame.width, height: keyWindow.frame.height) let videoPlayerFrame = CGRect(x: 0, y: 0, width: keyWindow.frame.width, height: keyWindow.frame.width * 9 / 16) let videoPlayerView = VideoPlayerView(frame: videoPlayerFrame) videoPlayerView .setupPlayerView(for: singleVideoURL) view.addSubview(videoPlayerView) keyWindow.addSubview(view) UIView.animate(withDuration: 0.5, delay: 0, options: .curveEaseOut, animations: { view.frame = keyWindow.frame }, completion: { (completedAnimation) in //possible features implemented later UIApplication.shared.isStatusBarHidden = true }) } 

首先,您必须通过在tableView中给它们添加标签值来区分单元格中添加的button:cellForRowAtIndexPath:方法

  cell.button.tag = indexpath.row 

这将为每个单元格中的button设置不同的标签值。 然后在下面添加:

  cell.button.addTarget(self, action:(YourController.buttonMethodPlayVideo(:)) , forControlEvents: .TouchUpInside) 

创build一个button来执行点击操作的方法:

  func buttonMethodPlayVideo(sender: UIButton) { print(sender.tag) } 

在上面的方法中,当你点击button时,你会得到不同的标签值。 根据这个价值,你可以播放不同的video或传递不同的video名称给玩家玩vudeo。

设置一个数组,把你的video的path,其索引应该匹配单元格的索引。 另外,你可以将单元格的行号传递给里面的button作为它的标签。 所以当你点击那个button,你可以通过button的标签在数组中find一个特定的videopath。