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

如何检测SwiftUI中DisclosureGroup的点击、展开与收起状态?

如何检测SwiftUI DisclosureGroup的点击操作与展开/收起状态

当然可以,你可以通过两种核心方式实现需求:

1. 监听展开/收起状态变化

通过给DisclosureGroup绑定一个状态变量,配合onChange修饰器就能实时捕获展开/收起的状态切换:

struct ContentView: View {
    @State private var isGroupExpanded = false
    let description = "这里是展开后显示的内容"
    
    var body: some View {
        DisclosureGroup(isExpanded: $isGroupExpanded) {
            Text(description)
        } label: {
            Text("title")
        }
        .onChange(of: isGroupExpanded) { newState in
            if newState {
                print("分组已展开")
            } else {
                print("分组已收起")
            }
        }
    }
}

绑定的isGroupExpanded变量会自动同步DisclosureGroup的状态,onChange会在状态变化时触发回调逻辑。

2. 检测点击操作

如果需要监听label的点击事件,有两种实现方式:

方式一:保留默认切换逻辑,同时监听点击

使用simultaneousGesture可以在不破坏DisclosureGroup默认展开/收起行为的前提下,额外捕获点击事件:

DisclosureGroup(isExpanded: $isGroupExpanded) {
    Text(description)
} label: {
    Text("title")
        .simultaneousGesture(
            TapGesture().onEnded {
                print("Label被点击")
            }
        )
}

方式二:自定义点击逻辑

如果你需要完全控制点击后的行为(比如先执行某些操作再切换状态),可以直接给label添加onTapGesture并手动切换状态:

DisclosureGroup(isExpanded: $isGroupExpanded) {
    Text(description)
} label: {
    Text("title")
        .onTapGesture {
            print("Label被点击,执行自定义逻辑")
            isGroupExpanded.toggle() // 手动切换展开状态
        }
}

内容的提问来源于stack exchange,提问作者GreatCornholio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:53:22