SwiftUI如何实现有条件触发Toggle 状态变更后视图未同步如何解决
问题原因
- 你当前的实现是直接将
Toggle与AutocorrectStatus做双向绑定,点击Toggle时会先修改状态值,再触发onChange回调,此时Toggle的UI已经先行完成了切换渲染,你在回调里再反转状态的操作会出现状态同步时序问题,导致UI和实际状态不一致。 onChange中连续修改同一个@Published属性,可能会被SwiftUI的状态合并机制忽略部分更新,最终表现就是视图没有响应你的二次反转。
解决方案
把直接绑定$env.AutocorrectStatus替换为自定义的Binding实例,在赋值逻辑里增加你需要的条件校验,只有满足条件时才修改真实的状态值,不需要再使用onChange监听反转。修改后的参考代码如下:
class GlobalEnvironment: ObservableObject { @Published var AutocorrectStatus = false } struct SettingView: View { @EnvironmentObject var env: GlobalEnvironment // 此处可替换为你自己的业务校验逻辑 private let isAllowToggle: Bool = true var body: some View { HStack { // 使用自定义Binding替代直接绑定 Toggle("", isOn: Binding( get: { env.AutocorrectStatus }, set: { newValue in // 只有满足条件才修改状态,不满足则Toggle不会跳转 if isAllowToggle { env.AutocorrectStatus = newValue } } )) .labelsHidden() Text(env.AutocorrectStatus ? "ON" : "OFF") .font(.system(size: 26, weight: .semibold)) .frame(alignment: .topLeading) } } }
如果需要异步校验(比如弹窗二次确认后再切换状态),只需要在set闭包中先不修改状态,等异步逻辑校验通过后再给env.AutocorrectStatus赋值即可。
内容的提问来源于stack exchange,提问作者yo1nk
相关产品推荐
相关产品推荐

