繁体   English   中英

SwiftUI 有条件地触发切换

[英]SwiftUI Conditionally trigger a toggle

我希望用户只能在某些特定条件下单击切换。 所以我在.onChange方法下再次反转“AutocorrectStatus”的值。 但似乎视图并没有遵循这种变化。 即使 AutocorrectStatus 的值为 false,它仍然会从 off 变为 on。 我应该怎么办?

class GlobalEnvironment: ObservableObject {
    @Published var AutocorrectStatus = false   
}

struct SettingView: View {

    @EnvironmentObject var env: GlobalEnvironment

    HStack() {
        Toggle("", isOn: self.$env.AutocorrectStatus)
            .labelsHidden()
            .onChange(of: self.env.AutocorrectStatus) { _AutocorrectStatus in
                self.env.AutocorrectStatus = !self.env.AutocorrectStatus
            }

        if self.env.AutocorrectStatus {
            Text ("ON")
                .font(.system(size: 26, weight: .semibold))
                .frame(alignment: .topLeading)
        } else {
            Text ("OFF")
                .font(.system(size: 26, weight: .semibold))
                .frame(alignment: .topLeading)
        }
    }
}

有几种方法可以做到这一点。 一种方法是为切换提供一个绑定,该绑定在更新值之前执行必要的检查。

var body: some View {
        HStack {
            Toggle("", isOn: self.provideAutocorrectBinding())
        }
    }
    
    func provideAutocorrectBinding() -> Binding<Bool> {
        return Binding(get: {
            return self.env.AutocorrectStatus
        }, set: { newValue in
            let isConnected = false // Your logic to check the connection
            if isConnected {
                self.env.AutocorrectStatus = newValue
            }
        })
    }

您也可以在那里触发警报:

struct ContentView: View {
    
    @EnvironmentObject var env: GlobalEnvironment
    @State private var showingAlert = false
    
    var body: some View {
        HStack {
            Toggle("", isOn: self.provideAutocorrectBinding())
        }
        .alert("Your message.", isPresented: $showingAlert) {
            Button("OK", role: .cancel) { }
        }
        
    }
    
    func provideAutocorrectBinding() -> Binding<Bool> {
        return Binding(get: {
            return self.env.AutocorrectStatus
        }, set: { newValue in
            let isConnected = false // Your logic to check the connection
            if isConnected {
                self.env.AutocorrectStatus = newValue
            } else {
                self.showingAlert.toggle()
            }
        })
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM