SwiftUI中使用@Published修改Picker选中值时选中回弹问题如何解决
问题原因
- 类型不匹配是核心问题:你为Picker绑定的选中值
$hihi.sel是Int类型,但遍历characters字符串数组生成的Picker选项,默认携带的tag是对应字符串本身(String类型),二者类型不匹配导致选中操作无法将值正确写入sel变量,系统识别不到有效选中值就会自动回弹到初始的第0位。 - 次要问题:你在调用
now视图时传入了全新的something()实例,没有复用ContentView持有的hihi对象,同时now视图中用@StateObject接收外部传入的ObservableObject,用法错误,会导致两个视图的数据无法同步。
解决方法
方案1:为Picker选项手动指定Int类型tag(推荐,不需要修改原有数据结构)
修改Picker部分代码,给每个Text选项添加与索引对应的Int类型tag:
Picker("Please choose a character", selection: $hihi.sel) { ForEach(characters, id: \.self) { name in Text(name) .tag(characters.firstIndex(of: name) ?? 0) } }
方案2:修改sel的类型为String,直接存储选中的字符串
修改something类的sel属性类型:
class something: ObservableObject { @Published var sel = "Makima" // 初始值设为数组第一个元素 }
同步修改ContentView中展示选中值的代码:
// 原来的Text(characters[hihi.sel])改成 Text(hihi.sel)
修复now视图的同步问题
- 把ContentView中调用now视图的代码改成传入当前持有的hihi实例:
// 原来的now(hihi: something())改成 now(hihi: hihi)
- 修改now视图的属性包装器,外部传入的ObservableObject要用
@ObservedObject接收:
struct now: View { @ObservedObject var hihi: something // 替换原来的@StateObject var body: some View { Text("\(hihi.sel)") } }
内容的提问来源于stack exchange,提问作者aadityaaa
相关产品推荐
相关产品推荐

