SwiftUI:点击切换并且变量状态发生变化时调用函数

Luk*_*kas 2 binding state function toggle swiftui

我知道已经有一个关于该主题的线程(How can I trigger an action when a swiftUI toggle() is Switched?),但我尝试了每个答案,但没有任何效果。

首先是我的代码:

struct ContentView: View {
    
    @State private var isOn = false
    
    
    var body: some View {
        
        NavigationView{
            VStack{
                ZStack {
                    Form{
                        // HERE THE IMPORTANT PART

                        Toggle(isOn: %isOn) {
                            Text(isOn ? "On" : "Off")
                            
                            /*if(isOn){
                                Text("\(sendState(state: isOn))")
                            }else{
                                Text("\(sendState(state: isOn))")
                            }*/
                              //--> that is a workaround but doesn't work for me because the function send something to the server and that should only happen when the Toggle State is changed but now the function is called every time the view is changed//


                        }
                    }
                }
            }
            
    func sendState(state: Bool){
        if state{
            mqttClient.publish("rpi/gpio", withString: "on")
            print("Published ON")
        }else{
            mqttClient.publish("rpi/gpio", withString: "off")
            print("Published OFF")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,我想做的是当我点击切换并且 isOn 的状态更改为 true 或 false 时调用函数 sendState(state: isOn) 。我尝试了 willSet、didSet、自己的绑定扩展和其他一些东西,但没有像我上面所说的那样工作。

有人可以帮我吗?

Asp*_*eri 7

SwiftUI 2.0

Xcode 12 / iOS 14

就像这样简单

Toggle(isOn: $isOn) {
    Text(isOn ? "On" : "Off")
}.onChange(of: isOn) {
    self.sendState(state: $0)
}
Run Code Online (Sandbox Code Playgroud)

SwiftUI 1.0+(仍然有效)

有点复杂

Toggle(isOn: $isOn) {
    Text(isOn ? "On" : "Off")
}.onReceive([isOn].publisher.first()) {
    self.sendState(state: $0)
}
Run Code Online (Sandbox Code Playgroud)