You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:06:25