UIContextualAction触发setEditing = true,如何禁用此功能?

时间:2018-12-26 14:59:05

标签: ios swift uitableview uikit uicontextualaction

我刚刚实现了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调用,这又触发了我的编辑动画以及进入编辑模式时想要的其他更改。 (上下文操作与编辑/删除无关)。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我能够通过触发不同的“真实”编辑模式来解决此问题。

在我的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,其中一个UIContextualActionUIContextualAction(style: .destructive)初始化(即具有破坏性的样式)。这是用于显示删除确认的项目。

但是,当我使用常规的滑动操作时,我不希望该项目可见。因此,我仅使用realEditMode标志来显示一种“真实编辑模式”。

这对我有用,而且似乎不太笨拙。如果出现更多官方消息,我很乐意更改接受的答案。