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

qxsslcnc  于 2023-06-21  发布在  Swift
关注(0)|答案(2)|浏览(108)

我刚刚实现了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是通过滑动动作调用的。
有什么想法吗

fivyi3re

fivyi3re1#

我能够通过不同的方式触发“真实的”编辑模式来解决这个问题。
在我的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(即具有破坏性风格)。这是随后用于显示删除确认的项目。
但是我不想在使用常规滑动操作时看到该项目,所以只显示一个“真实的的编辑模式”,我使用了realEditMode标志。
这对我来说很有效,而且看起来也不太古怪。如果有任何更官方的消息出现,我很乐意改变公认的答案。

nhn9ugyo

nhn9ugyo2#

如果有人遇到这个问题,答案是here
简单地覆盖tableView(:willBeginEditingRowAt:)将阻止在单元格滑动开始时调用setEditing(true)。
覆盖tableView(
:didEndEditingRowAt:)可以防止在单元格编辑结束时调用setEditing(false)。

相关问题