SwiftUI: функция вызова при нажатии на переключатель и изменении состояния переменной - PullRequest
1 голос
/ 06 августа 2020
• 1000 1003 *

Сначала мой код:

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")
        }
    }
}

Итак, я хочу вызвать функцию sendState (state: isOn), когда я нажимаю на переключатель и состояние isOn меняется на true или ложный. Я пробовал willSet, didSet, собственные расширения для привязок и некоторые другие вещи, но ничего не работало, как я сказал выше.

Кто-нибудь может мне помочь, пожалуйста?

1 Ответ

0 голосов
/ 06 августа 2020

SwiftUI 2.0

Xcode 12 / iOS 14

Так же просто, как

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

SwiftUI 1.0 + (все еще актуально)

Немного сложнее

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