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

SwiftUI中如何检测工具栏内editMode的值变化?

SwiftUI中如何检测工具栏内editMode的值变化?

嘿,我懂你想监测SwiftUI里EditButton触发的编辑状态变化的需求!看你给出的代码片段,其实有几种直观的方法可以实现这个功能,我一步步给你说明:

方法一:直接使用.onChange监听editMode变化

我们可以利用SwiftUI的.onChange修饰符,直接监听editMode的状态变更。因为editMode是一个Environment属性,它的wrappedValue会在编辑状态切换时(从inactive到active,或者反过来)更新。

给你补全并修改后的完整代码示例:

import SwiftUI

struct ContentView: View {
    @State private var elements: Set<UUID> = [.init(), .init(), .init()]
    @State private var selection: Set<UUID> = []
    
    @Environment(\.editMode) private var editMode
        
    var body: some View {
        NavigationStack {
            List(
                elements.sorted(),
                id: \.self,
                selection: $selection,
                rowContent: { Text(String(describing: $0)) }
            )
            .toolbar {
                ToolbarItem(placement: .topBarTrailing) {
                    EditButton()
                }
                ToolbarItem(placement: .topBarLeading) {
                    Button(selection.count == elements.count ? "Unselect All" : "Select All") {
                        selection = selection.count == elements.count ? [] : elements
                    }
                    // 这里可以根据编辑状态控制按钮显隐,比如只有编辑模式下才显示
                    .opacity(editMode?.wrappedValue == .active ? 1 : 0)
                }
            }
            // 监听editMode的变化
            .onChange(of: editMode?.wrappedValue) { newEditState in
                switch newEditState {
                case .active:
                    print("进入编辑模式啦!")
                    // 在这里执行编辑模式激活后的逻辑,比如初始化选中状态等
                case .inactive, .none:
                    print("退出编辑模式啦!")
                    // 执行编辑模式关闭后的逻辑,比如清空选中项等
                }
            }
        }
    }
}

方法二:同步到自定义State变量(方便多处使用)

如果你的页面里多个地方需要用到编辑状态,或者想让代码更清晰,可以把editMode的状态同步到一个自定义的@State变量中:

import SwiftUI

struct ContentView: View {
    @State private var elements: Set<UUID> = [.init(), .init(), .init()]
    @State private var selection: Set<UUID> = []
    @State private var isEditing = false // 自定义的编辑状态变量
    
    @Environment(\.editMode) private var editMode
        
    var body: some View {
        NavigationStack {
            List(
                elements.sorted(),
                id: \.self,
                selection: $selection,
                rowContent: { Text(String(describing: $0)) }
            )
            .toolbar {
                ToolbarItem(placement: .topBarTrailing) {
                    EditButton()
                }
                ToolbarItem(placement: .topBarLeading) {
                    Button(selection.count == elements.count ? "Unselect All" : "Select All") {
                        selection = selection.count == elements.count ? [] : elements
                    }
                    .opacity(isEditing ? 1 : 0) // 直接使用自定义变量
                }
            }
            // 同步editMode状态到自定义变量
            .onChange(of: editMode?.wrappedValue) { newEditState in
                isEditing = newEditState == .active
                // 同样可以在这里添加状态变化后的逻辑
                if isEditing {
                    print("进入编辑模式")
                } else {
                    print("退出编辑模式")
                }
            }
        }
    }
}

小提示

  • editMode的wrappedValue是一个EditMode枚举,只有.active(编辑中)和.inactive(非编辑)两种状态
  • 如果你需要在视图初始化时就获取当前编辑状态,可以在.onAppear里读取editMode?.wrappedValue

备注:内容来源于stack exchange,提问作者parapote

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 09:48:01