SwiftUI中如何为一组按钮触发onChange()事件?
解决SwiftUI地图类型选择按钮无法触发onChange的问题
问题根源
你当前的onChange监听的是@State var mapType,但按钮点击时直接修改的是mapSettings.mapType,完全没更新mapType这个变量,所以onChange自然不会触发。
解决方案一:通过@State变量中转更新
修改按钮的点击逻辑,先更新@State var mapType,让onChange捕获到变化后再同步到mapSettings.mapType:
@State var mapType = 0 @State var mapDisplay: [String] = [ "Standard", "Hybrid", "Image", ] HStack { ForEach(mapDisplay, id: \.self) { item in // 去掉多余嵌套的VStack/HStack,简化结构 Button(action: { // 先更新@State的mapType switch item { case "Standard": mapType = 0 case "Hybrid": mapType = 1 case "Image": mapType = 2 default: mapType = 0 } print("User has selected \(item) map type.") }, label: { Text(item) }) } .onChange(of: mapType) { newValue in mapSettings.mapType = newValue log.info("The new map type is: \(newValue)") } }
解决方案二:直接监听mapSettings的mapType(推荐)
如果mapSettings是ObservableObject类型(遵循ObservableObject协议),可以直接监听它的mapType属性,省去额外的@State变量:
@State var mapDisplay: [String] = [ "Standard", "Hybrid", "Image", ] HStack { ForEach(mapDisplay, id: \.self) { item in Button(action: { switch item { case "Standard": mapSettings.mapType = 0 case "Hybrid": mapSettings.mapType = 1 case "Image": mapSettings.mapType = 2 default: mapSettings.mapType = 0 } print("User has selected \(item) map type.") }, label: { Text(item) }) } .onChange(of: mapSettings.mapType) { newValue in log.info("The new map type is: \(newValue)") } }
额外优化
你代码里嵌套了多层无用的VStack和HStack,直接保留Button即可,简化视图结构的同时不影响功能。
内容的提问来源于stack exchange,提问作者SLE
相关产品推荐
相关产品推荐

