ios - 为什么 Property Observer 不适用于 SwiftUI 中的 Picker
问题描述
当我使用按钮(ontapGesture)更改 selecteddrive 时,它会打印“值已更改”,但是当我使用 Picker 更改值时,didset 函数不起作用。
enum WheelDrive: String, CaseIterable, Identifiable {
case frontdrive
case reardrive
case Fourwheeldrive
case Neutral
var id: String { self.rawValue }
}
@State var selecteddrive = WheelDrive.Fourwheeldrive {
willSet(newValue){ print("value changed")}
}
Picker(selection: $selecteddrive, label: Text("WheelDrive")) {
Text("前驱").tag(WheelDrive.frontdrive)
.foregroundColor(.white)
Text("后驱").tag(WheelDrive.reardrive)
.foregroundColor(.white)
Text("四驱").tag(WheelDrive.Fourwheeldrive)
.foregroundColor(.white)
Text("滑行").tag(WheelDrive.Neutral)
.foregroundColor(.white)
}
解决方案
使用自定义绑定
Picker(selection: Binding(get: {selecteddrive}, set: {selecteddrive = $0}), label: Text("WheelDrive")) { //<-- Here
Text("前驱").tag(WheelDrive.frontdrive)
.foregroundColor(.white)
Text("后驱").tag(WheelDrive.reardrive)
.foregroundColor(.white)
Text("四驱").tag(WheelDrive.Fourwheeldrive)
.foregroundColor(.white)
Text("滑行").tag(WheelDrive.Neutral)
.foregroundColor(.white)
}
或者您可以.onChange
用于捕获价值。
Picker(selection: $selecteddrive, label: Text("WheelDrive")) {
Text("前驱").tag(WheelDrive.frontdrive)
.foregroundColor(.white)
Text("后驱").tag(WheelDrive.reardrive)
.foregroundColor(.white)
Text("四驱").tag(WheelDrive.Fourwheeldrive)
.foregroundColor(.white)
Text("滑行").tag(WheelDrive.Neutral)
.foregroundColor(.white)
}
.onChange(of: selecteddrive, perform: { (selecteddrive) in //<- Here
print(selecteddrive)
})
推荐阅读
- javascript - 如何只更改jstree的一个节点
- python - 尝试在 android 上安装 kivymd 时,我遇到了 PEP517 轮子的问题
- c - 打印 c 中类型的最大数字 - 努力格式化正确的类型
- asp.net - System.Diagnostics.TraceSource 未将数据发送到 Application Insights
- reactjs - 如何在 SPA 中动态加载具有反应的时刻语言环境并强制在本地环境和生产环境中重新渲染?
- php - PHP通过循环上传多个图像
- flask - Flask 2.0 async - RuntimeError:在请求上下文之外工作
- wordpress - 当我尝试从 REST API 获取 token_id 时,邮递员出现 401 错误
- python-3.x - 试图查找过去一小时内创建的任何 AMI
- html - 同时从父级和子级更改 flex 会触发闪烁