UIContextualAction 触发 setEditing = true,如何禁用它?
UIContextualAction triggers setEditing = true, how to disable this?
我刚刚实施了 trailingSwipeActionsConfigurationForRowAt
和 leadingSwipeActionsConfigurationForRowAt
以向我的 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
调用,这反过来也会触发我的编辑动画和进入编辑模式时我想要的其他更改。 (上下文操作与 editing/deleting 无关)。
我不想要这个,但还没有找到禁用此行为的方法,即使只是检测到 setEditing
是通过滑动操作调用的。
有什么想法吗?
我能够通过以不同方式触发 "real" 编辑模式来解决这个问题。
我的 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
(即具有破坏性的风格)。这是用于显示删除确认的项目。
但是我不希望在使用常规滑动操作时显示该项目,因此只显示一个 "real edit mode" 我使用了 realEditMode
标志。
这对我有用,而且看起来不太老套。如果弹出更多官方信息,我非常乐意更改已接受的答案。
我刚刚实施了 trailingSwipeActionsConfigurationForRowAt
和 leadingSwipeActionsConfigurationForRowAt
以向我的 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
调用,这反过来也会触发我的编辑动画和进入编辑模式时我想要的其他更改。 (上下文操作与 editing/deleting 无关)。
我不想要这个,但还没有找到禁用此行为的方法,即使只是检测到 setEditing
是通过滑动操作调用的。
有什么想法吗?
我能够通过以不同方式触发 "real" 编辑模式来解决这个问题。
我的 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
(即具有破坏性的风格)。这是用于显示删除确认的项目。
但是我不希望在使用常规滑动操作时显示该项目,因此只显示一个 "real edit mode" 我使用了 realEditMode
标志。
这对我有用,而且看起来不太老套。如果弹出更多官方信息,我非常乐意更改已接受的答案。