UIContextualAction 触发 setEditing = true,如何禁用它?

UIContextualAction triggers setEditing = true, how to disable this?

我刚刚实施了 trailingSwipeActionsConfigurationForRowAtleadingSwipeActionsConfigurationForRowAt 以向我的 UITableViewCell 添加滑动操作。

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration
func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration

这会触发(在我的 UITableViewController 上)func setEditing(_ editing: Bool, animated: Bool) 使用 editing = true 调用,这反过来也会触发我的编辑动画和进入编辑模式时我想要的其他更改。 (上下文操作与 editing/deleting 无关)。

我不想要这个,但还没有找到禁用此行为的方法,即使只是检测到 setEditing 是通过滑动操作调用的。

有什么想法吗?

我能够通过以不同方式触发 "real" 编辑模式来解决这个问题。

我的 UITableViewController:

class MyTableViewController: UITableViewController {
  var realEditMode: Bool = false

  func setRealEditing(_ editing: Bool) {
    realEditMode = editing
    setEditing(realEditMode, animated: true)
  }

  // See Note 1 below
  @available(iOS 11.0, *)
  override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration {
    guard let item = itemForIndexPath(indexPath) else {
      return UISwipeActionsConfiguration(actions: [])
    }

    if realEditMode {
      return UISwipeActionsConfiguration(actions: [
        buildActionConfiguration(.delete, fromIndexPath: indexPath)
      ])
    } else {
      return UISwipeActionsConfiguration(actions: [
        buildActionConfiguration(.read, fromIndexPath: indexPath)
      ])
    }
  }

  @available(iOS 11.0, *)
  func buildActionConfiguration(_ action: MyCellActionEnum, fromIndexPath indexPath: IndexPath) -> UIContextualAction {
    // logic to build `UIContextualAction`
  }
}

然后在我的 UITableViewCell 中检查 editing 标志是通过手动触发还是通过滑动编辑触发设置的:

class MyCell: UITableViewCell {
  var myTableViewController: MyTableViewController?

  override func setEditing(_ editing: Bool, animated: Bool) {
    if editing && !(myTableViewController?.realEditMode ?? true) {
        return
    }

    super.setEditing(editing, animated: animated)
  }
}

然后在 UI 中的编辑按钮上,我将 setEditing(true/false, animated: true) 更改为 setRealEditing(true/false)

注释 1

我发现的一个问题是,当使用 trailingSwipeActionsConfigurationForRowAt 时,删除按钮 (⛔️) 不再起作用。点击它不会触发确认滑动。

我发现必须存在一个 trailingSwipeActionsConfigurationForRowAt 和一个用 UIContextualAction(style: .destructive) 初始化的 UIContextualAction (即具有破坏性的风格)。这是用于显示删除确认的项目。

但是我不希望在使用常规滑动操作时显示该项目,因此只显示一个 "real edit mode" 我使用了 realEditMode 标志。

这对我有用,而且看起来不太老套。如果弹出更多官方信息,我非常乐意更改已接受的答案。