UIContextualAction 触发 setEditing = true,如何禁用?
Posted
技术标签:
【中文标题】UIContextualAction 触发 setEditing = true,如何禁用?【英文标题】:UIContextualAction triggers setEditing = true, how to disable this? 【发布时间】:2018-12-26 14:59:05 【问题描述】:我刚刚实现了trailingSwipeActionsConfigurationForRowAt
和leadingSwipeActionsConfigurationForRowAt
以将滑动操作添加到我的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
。
有什么想法吗?
【问题讨论】:
恐怕它应该是这样工作的。 【参考方案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,如何禁用?的主要内容,如果未能解决你的问题,请参考以下文章