SwiftUI如何仅为DisclosureGroup设置删除动作不作用于其内容
问题场景
实现可展开收起的动态列表时,使用DisclosureGroup做展开容器,给外层ForEach添加.onDelete滑动删除能力后,展开出来的子内容行也会出现滑动删除入口,需要让删除动作仅在DisclosureGroup的标题行生效,展开的内部操作行不触发删除。
参考异常效果截图:
问题复现代码:
import SwiftUI struct ContentView: View { var body: some View { List { ForEach(0 ..< 10) { number in DisclosureGroup { Button("Action") {} } label: { Text("\(number)") } } .onDelete { _ in } } } }
解决方法
这个问题是SwiftUI列表的默认行为:ForEach上挂载的列表行操作会自动向下传递给同层级DisclosureGroup展开的所有子行。只需要给DisclosureGroup内部的子内容显式禁用删除能力即可,不需要调整外层结构:
import SwiftUI struct ContentView: View { var body: some View { List { ForEach(0 ..< 10) { number in DisclosureGroup { Button("Action") {} // 核心修饰:禁用当前子行的删除动作 .deleteDisabled(true) } label: { Text("\(number)") } } .onDelete { indexSet in // 正常编写列表项删除逻辑即可 } } } }
如果后续要给列表加其他自定义滑动操作,也可以用同样的思路处理:
- 给
DisclosureGroup的内部子内容加空的.swipeActions修饰,阻断父级操作的向下继承 - 仅在
DisclosureGroup的label标题行绑定需要的滑动操作,避免子内容误触发
内容的提问来源于stack exchange,提问作者Fawzi Rifai
相关产品推荐
相关产品推荐

