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
相关产品推荐
相关产品推荐

