如何以编程方式触发UITableViewCell editActions?

我在我的tableviewcell上做了一些自定义的编辑操作。 当我滑动时,它工作正常,但我想知道是否有任何方法来触发这些行动,当我点击细胞。 另外,我看到很多人只是回答类似的问题,

tableView.setEditing(true, animated: true) 

虽然这不是我正在寻找的解决scheme。 我希望在没有按下另一个button的情况下立即显示操作。

这就是我所说的editActions

谢谢。

简短的回答是 – 没有这样的方式。

然而,如果你真的需要这样的东西,你可以模仿这种行为,尽pipe它需要更多的实现和状态处理。

这是一个快速和非常肮脏的解决scheme,它会覆盖您的自定义单元格的touchesEnded方法。 请记住在相关的故事板中的表格视图中将单元格设置为单元格的dynamic原型,并将其重用标识符设置为标识符。

 import UIKit class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, CellDelegate { @IBOutlet weak var tableView: UITableView? override func viewDidLoad() { super.viewDidLoad() } func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 10 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let cell = tableView.dequeueReusableCell(withIdentifier: "identifier") as? Cell else { return UITableViewCell() } cell.textLabel?.text = "\(indexPath.row)" cell.indexPath = indexPath cell.delegate = self return cell } func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { return nil } func doAction(for cell: Cell) { let indexPath = cell.indexPath print("doing action for cell at: \(indexPath!.row)") // your implementation for action // maybe delete a cell or whatever? cell.hideFakeActions() } } protocol CellDelegate: class { func doAction(for cell: Cell) } class Cell: UITableViewCell { weak var delegate: CellDelegate? var indexPath: IndexPath! @IBOutlet weak var buttonAction1: UIButton? @IBOutlet weak var constraintButtonFakeActionWidth: NSLayoutConstraint? override func awakeFromNib() { self.constraintButtonFakeActionWidth?.constant = 0 } override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { guard let point = touches.first?.location(in: self) else { return } if self.point(inside: point, with: event) { print("event is in cell number \(indexPath.row)") self.showFakeActions() } } func showFakeActions() { self.constraintButtonFakeActionWidth?.constant = 80 UIView.animate(withDuration: 0.3) { self.layoutIfNeeded() } } func hideFakeActions() { self.constraintButtonFakeActionWidth?.constant = 0 UIView.animate(withDuration: 0.3) { self.layoutIfNeeded() } } @IBAction func fakeAction() { delegate?.doAction(for: self) } } 

那么它是怎样工作的? 每个单元格是从抽象的UIResponder接口inheritance的UIView 。 您可以覆盖其方法代表分派给它们的事件自行执行操作。 这是覆盖touchesEnded

看一下界面生成器的截图 – 你必须把约束关联起来。 在这里输入图像说明

我也实现了委托,它返回单元格的所有编辑操作的nil,所以它们不会干扰你的解决方法。

接下来,您将设置一个自定义委托来获取单元格中的callback。 为了方便pipe理dataSource中的数据,我还将IndexPath附加到单元格中,您必须执行此操作。

请记住,这段代码缺less很多,比如prepareForReuse方法的实现。 另外,你可能想在touchesEnded重写中进行额外的检查,这可以保证这个委托callback不会触发每次触摸一次以上,并防止多次触摸。 禁用用户交互的逻辑在这里也没有实现。 而且界面需要微调(就像在animation中文字被压扁一样)。