我正在使用 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()块,包括第一次和每次按下按钮(切换显示消息)时。
有什么想法为什么会发生这种情况以及我只能在选择器值更改时做出反应吗?
这是可能的解决方案而不是.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)
| 归档时间: |
|
| 查看次数: |
1321 次 |
| 最近记录: |