如何将长按手势识别器添加到tableview单元格内的按钮?

问题描述:

我想添加一个长按手势识别器到一个tableview单元格内的按钮。但我无法弄清楚我做错了什么。当用户点击并按住按钮时,我想让我的按钮播放不同的音频文件。如何将长按手势识别器添加到tableview单元格内的按钮?

我的代码

import UIKit 
import AVFoundation 

class ViewController6: UIViewController, UITableViewDataSource, UITableViewDelegate 
{ 

    var player = AVQueuePlayer() 


    @IBOutlet var tableView: UITableView! 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 
    } 

    override func didReceiveMemoryWarning() 
    { 
     super.didReceiveMemoryWarning() 
    } 


//Functions for tableView 

    //Cell - For Rifles 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    { 
     return (arrayOfRifles.count) 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    { 
     let cell6 = tableView.dequeueReusableCell(withIdentifier: "cell6", for: indexPath) as! ViewControllerTableViewCell6 

     cell6.myImage.image = UIImage(named: arrayOfRifles[indexPath.row] + ".jpg") 
     cell6.myButton.setTitle(buttonDataRifles[indexPath.row], for: UIControlState.normal) 
     cell6.myButton.tag = indexPath.row 
     cell6.myButton.addTarget(self, action: #selector(buttonAction), for: .touchUpInside) 
     cell6.myButton.addGestureRecognizer(longPressGesture) 
     return cell6 

    } 

    func longPressGesture() { 
     let lpg = UILongPressGestureRecognizer(target: self, action: "longPress") 
     lpg.minimumPressDuration = 0.5 
    } 

    func longPress(_ sender: UIButton) { 
     if let url = Bundle.main.url(forResource: soundArrayRiflesUzun[(sender as AnyObject).tag], withExtension: "mp3") 
     { 
      player.removeAllItems() 
      player.insert(AVPlayerItem(url: url), after: nil) 
      player.play() 

     } 

    } 

//Action for Sounds 


    @IBAction func buttonAction(_ sender: UIButton) 
    { 

     if let url = Bundle.main.url(forResource: soundArrayRifles[sender.tag], withExtension: "mp3") 
     { 
      player.removeAllItems() 
      player.insert(AVPlayerItem(url: url), after: nil) 
      player.play() 

     } 

    } 

} 

我在这一行

cell6.myButton.addGestureRecognizer(longPressGesture) 
+0

是什么错误说? –

做这样得到一个错误,

cell6.myButton.addTarget(self, action: #selector(ViewController6.buttonAction(_:)), for: .touchUpInside) 
cell6.myButton.addGestureRecognizer(self.longPressGesture()) 

func longPressGesture() -> UILongPressGestureRecognizer { 
    let lpg = UILongPressGestureRecognizer(target: self, action: #selector(ViewController6.longPress)) 
    lpg.minimumPressDuration = 0.5 
    return lpg 
} 

func longPress(_ sender: UILongPressGestureRecognizer) { 
    if let url = Bundle.main.url(forResource: soundArrayRiflesUzun[sender.view.tag], withExtension: "mp3") 
    { 
     player.removeAllItems() 
     player.insert(AVPlayerItem(url: url), after: nil) 
     player.play() 

    } 

} 
+1

谢谢你,工作。但是当我释放按钮时,音频文件开始再次播放。你有什么想法如何解决这个问题? –

+1

也修正了这个问题。我添加了'如果sender.state == UIGestureRecognizerState.began'和'如果sender.state == UIGestureRecognizerState.ended'再次非常感谢你的帮助 –

让你的方法返回lpg

func longPressGesture() -> UILongPressGestureRecognizer { 
    let lpg = UILongPressGestureRecognizer(target: self, action: "longPress") 
    lpg.minimumPressDuration = 0.5 
    return lpg 
} 

,并调用它像这样:

... 
cell6.myButton.addGestureRecognizer(longPressGesture()) 
    return cell6 

}