每次渲染主体时都会调用 SwiftUI Picker onReceive()

num*_*er4 3 swiftui

我正在使用 aPicker来显示分段控件,并希望知道选择器值何时发生变化,以便我可以执行非 UI 操作。使用建议的onReceive()修改器(如此处建议的不起作用,因为每次渲染主体时都会调用它。

这是我的代码:

struct PickerView: View {

    @State private var weather = 0
    @State private var showMessage = false

    var body: some View {

        VStack(spacing: 24) {
            Picker(selection: $weather, label: Text("Weather")) {
                Image(systemName: "sun.max.fill").tag(0)
                Image(systemName: "cloud.sun.rain.fill").tag(1)
            }
            .pickerStyle(SegmentedPickerStyle())
            .frame(width: 120, height: 48)
            .onReceive([weather].publisher.first()) { connectionType in
                print("connection type is: \(connectionType)")
            }

            Button(action: { self.showMessage.toggle() }) {
                Text("Press Me")
            }

            if showMessage {
                Text("Hello World")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

每当渲染主体时,都会调用该onReceive()块,包括第一次和每次按下按钮(切换显示消息)时。

有什么想法为什么会发生这种情况以及我只能在选择器值更改时做出反应吗?

Asp*_*eri 6

这是可能的解决方案而不是.onReceive

Picker(selection: Binding(           // << proxy binding
                get: { self.weather },
                set: { self.weather = $0
                    print("connection type is: \($0)")  // side-effect
                })
    , label: Text("Weather")) {
    Image(systemName: "sun.max.fill").tag(0)
    Image(systemName: "cloud.sun.rain.fill").tag(1)
}
Run Code Online (Sandbox Code Playgroud)