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

标签 ios swift uitableview uikit uicontextualaction

我刚刚实现了trailingSwipeActionsConfigurationForRowAtleadingSwipeActionsConfigurationForRowAt将滑动操作添加到我的 UITableViewCell s。

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通过滑动操作调用。

有什么想法吗?

最佳答案

我能够通过以不同方式触发“真实”编辑模式来解决这个问题。

在我的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中检查编辑标志是通过手动触发还是通过滑动编辑触发设置的:

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 时,删除按钮 (⛔️) 不再起作用。点击它不会触发确认滑动。

我发现必须存在一个带有 UIContextualActiontrailingSwipeActionsConfigurationForRowAt ,该 UIContextualAction 是用 UIContextualAction(style: .pressive) 初始化的(即破坏性风格)。这是随后用于显示删除确认的项目。

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

这对我很有用,而且看起来不太黑客。如果出现任何更正式的内容,我非常乐意更改已接受的答案。

关于ios - UIContextualAction 触发 setEditing = true,如何禁用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53933674/

相关文章:

具有相同名称的 Swift 枚举案例

iphone - 具有多个文本字段的组 TableView

ios - 如何在 if 语句中成功调用 BOOL 方法?

ios - 为什么reloadData会重置UITableView的高度?

ios - Swift 在解包一个可选值时意外地发现 nil

ios - 如何根据String长度获取CGFloat/CGSize?

ios - 设置原型(prototype)单元的标识符时, Storyboard 编译失败

ios - 原型(prototype)可重用 tableview 单元格渲染 subview 很差

ios - 无法在 UISearchBar 中将 UITextField 的 borderStyle 设置为 None

ios - 为什么 UISupportedInterfaceOrientations 设置不影响 UIViewController 行为?