ios - UIContextualAction 触发 setEditing = true,如何禁用?
问题描述
我刚刚实现trailingSwipeActionsConfigurationForRowAt
并向leadingSwipeActionsConfigurationForRowAt
我的 s 添加了滑动操作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
通过滑动操作调用的方法。
有任何想法吗?
解决方案
我能够通过以不同方式触发“真实”编辑模式来解决这个问题。
在我的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
用 aUIContextualAction
初始化的a UIContextualAction(style: .destructive)
(即具有破坏性风格)。这是然后用于显示删除确认的项目。
但是,当使用常规滑动操作时,我不希望该项目可见,因此只显示一个“真正的编辑模式”,我使用了realEditMode
标志。
这对我有用,而且看起来并不太老套。如果出现任何更官方的消息,我非常乐意更改已接受的答案。
推荐阅读
- html - gitlab页面不能直接访问,需要登录gitlab
- r - 如何在 R 中使用滚动变量构建序列
- reactjs - react-componentDidMount 方法后如何在 JSX 中使用 API 数据?
- java - 如何使用 printf 分隔多个十进制数字并将所有这些数字四舍五入到小数点后 2 位
- php - 如何计算一个数组中的两个数据?
- meteor - Apollo / GraphQl - 单实体突变不更新缓存(数据库更新)
- php - 如何使用 PHP 从网站到网站传递主机名和安全密钥以进行验证
- rust - rust by example:闭包迭代器any给出E0308
- c++ - 在对集合内的向量的迭代中转换为非标量类型
- android-studio - 如何在我的 Macbook Pro 2013 16GB RAM 和 480GB SSD 上加速 Android Studio