我想为UITableView中的每个单元格添加一个轻击手势,以编辑其中的内容.添加手势的两种方式是在代码中或通过故事板.我试过了两次,但他们失败了.
@H_301_2@我可以通过故事板拖放为表格中的每个单元格添加手势吗?它似乎只为第一个单元添加手势.在代码中添加手势,我写了类似的东西,
addGestureRecognizer(UITapGestureRecognizer(target: self,action:#selector(MyTableViewCell.tapEdit(_:))))@H_301_2@要么
addGestureRecognizer(UITapGestureRecognizer(target: self,action:"tapEdit:"))@H_301_2@都工作.但是我想让UITableViewController处理这个手势,因为它对数据源做了一些事情.如何编写目标和操作? @H_301_2@编辑:
addGestureRecognizer(UITapGestureRecognizer(target: MasterTableViewController.self,action:#selector(MasterTableViewController.newTapEdit(_:)))@H_301_2@它引发一个错误说,无法识别的选择器发送到类0x106e674e0 …
解决方法
要向UITableViewCell添加手势,您可以按照以下步骤操作:
@H_301_2@首先,将手势识别器添加到UITableView
tapGesture = UITapGestureRecognizer(target: self,action: #selector(tableViewController.tapEdit(_:))) tableView.addGestureRecognizer(tapGesture!) tapGesture!.delegate = self@H_301_2@然后,定义选择器.使用recognizer.locationInView找到您在tableView中点击的单元格.您可以通过tapIndexPath访问dataSource中的数据,tapIndexPath是用户点击的单元格的indexPath.
func tapEdit(recognizer: UITapGestureRecognizer) { if recognizer.state == UIGestureRecognizerState.Ended { let tapLocation = recognizer.locationInView(self.tableView) if let tapIndexPath = self.tableView.indexPathForRowAtPoint(tapLocation) { if let tappedCell = self.tableView.cellForRowAtIndexPath(tapIndexPath) as? MyTableViewCell { //do what you want to cell here } } } }@H_301_2@可以直接向TableView单元添加手势并访问viewController中的数据源,您需要设置一个委托: @H_301_2@在自定义单元格中:
import UIKit class MyTableViewCell: UITableViewCell { var delegate: myTableDelegate? override func awakeFromNib() { super.awakeFromNib() let tapGesture = UITapGestureRecognizer(target: self,action: #selector(MyTableViewCell.tapEdit(_:))) addGestureRecognizer(tapGesture) //tapGesture.delegate = ViewController() } func tapEdit(sender: UITapGestureRecognizer) { delegate?.myTableDelegate() } } protocol myTableDelegate { func myTableDelegate() }@H_301_2@在你的viewController中:
import UIKit class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UIGestureRecognizerDelegate,myTableDelegate { @IBOutlet var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() tableView.delegate = self tableView.dataSource = self // Do any additional setup after loading the view,typically from a nib. } func tableView(tableView: UITableView,numberOfRowsInSection section: Int) -> Int { return 35 } func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell",forIndexPath: indexPath) as? MyTableViewCell cell?.delegate = self return cell! } func myTableDelegate() { print("tapped") //modify your datasource here } }@H_301_2@但是,此方法可能会导致问题,请参阅UIGestureRecognizer and UITableViewCell issue.在这种情况下,当滑动手势成功时,选择器会因某种原因被调用两次.我不能说第二种方法是坏的,因为我还没有找到任何直接的证据,但在搜索谷歌之后,似乎第一种方法是标准方法.