You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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视图的同步问题

  1. 把ContentView中调用now视图的代码改成传入当前持有的hihi实例:
// 原来的now(hihi: something())改成
now(hihi: hihi)
  1. 修改now视图的属性包装器,外部传入的ObservableObject要用@ObservedObject接收:
struct now: View {
    @ObservedObject var hihi: something // 替换原来的@StateObject
    
    var body: some View {
        Text("\(hihi.sel)")
    }
}

内容的提问来源于stack exchange,提问作者aadityaaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:27:02