我已将
picker
放入 menu
内,以便将来可以应用自定义文本和图像。看来,在新的应用程序启动时,menu
只能在第二次点击时更新。第一次点击时,picker
复选标记会更新,但 ViewModel
和 menu
都不会更改,直到第二次点击为止。关于如何让所有组件每次都能工作有什么想法吗?
class ViewModel: ObservableObject {
@Published var soundSelection: String = "Off"
@Published var soundSelectionPickerValue: Int = 0
func updateSoundSelection(to: Int) {
var updatedSoundSelection: String
switch to {
case 0:
updatedSoundSelection = "off"
case 1:
updatedSoundSelection = "chime"
case 2:
updatedSoundSelection = "alert"
case 3:
updatedSoundSelection = "peaceful"
default:
return
}
soundSelection = updatedSoundSelection
}
}
struct ContentView: View {
@StateObject var viewModel: ViewModel
var body: some View {
VStack {
Menu {
Picker("", selection: $viewModel.soundSelectionPickerValue) {
Text("off").tag(0)
Text("chime").tag(1)
Text("alert").tag(2)
Text("peaceful").tag(3)
}
.onChange(of: viewModel.soundSelectionPickerValue) { tag in
viewModel.updateSoundSelection(to: tag) }
} label: {
VStack {
Text(viewModel.soundSelection)
}
}
}
}
}
这里的问题是您对 .onChange() 的调用是在菜单内部。此调用可以进行任意多个位置,因为它取决于变量,在您的情况下“viewModel.soundSelectionPickerValue”发生变化,而不是选取器本身。将此修改器移到菜单之外,它将正常工作。