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

Posted

技术标签:

【中文标题】UIContextualAction 触发 setEditing = true,如何禁用?【英文标题】:UIContextualAction triggers setEditing = true, how to disable this? 【发布时间】:2018-12-26 14:59:05 【问题描述】:

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

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】:

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

在我的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,该UIContextualAction(style: .destructive) 初始化为UIContextualAction(style: .destructive)(即具有破坏性风格)。这是然后用于显示删除确认的项目。

但是,当使用常规滑动操作时,我不希望该项目可见,所以为了只显示一个“真实编辑模式”,我使用了 realEditMode 标志。

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

【讨论】:

您有没有弄清楚为什么在配置这些滑动操作时删除按钮不起作用(您的注释 1)?我在问,因为我遇到了完全相同的问题。 @MER 不,恐怕我没有比概述的解决方案更进一步。该解决方案对我来说效果很好,所以没有试图理解为什么它不起作用

以上是关于UIContextualAction 触发 setEditing = true,如何禁用?的主要内容,如果未能解决你的问题,请参考以下文章

UIContextualAction 图标和文本对齐

如何在 UITableview DataSource 方法中的 UIContextualAction 中添加图像

来自Settings.settings变量的WPF触发器

未触发计算属性(添加到 Set)

vue.set动态新增对象属性,触发dom渲染

在 SQL 中触发导致错误“Product_Reorder 不是可识别的 SET 选项”