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

SwiftUI中如何让Picker绑定ObservableObject类的可选类型属性?

问题核心原因
  • @State修饰符仅适用于值类型的本地状态,你用来存储可选枚举的cl1是遵循ObservableObject协议的引用类型,必须使用@StateObject修饰才能正常监听@Published属性的变更,触发视图刷新。
  • 你当前的写法中@Published属性的变更无法通知到视图,所以Picker看起来无法正常选中值。
修复方案

仅需将ContentView中selectedFlavor的修饰符从@State替换为@StateObject即可,修改后的完整代码如下:

enum Flavor: String, CaseIterable, Identifiable {
    case chocolate
    case vanilla
    case strawberry

    var id: String { self.rawValue }
}
class cl1: ObservableObject {
    @Published var fl: Flavor?
}
struct ContentView: View {
    // 替换@State为@StateObject
    @StateObject private var selectedFlavor: cl1 = cl1()
    var body: some View {
        Picker("Flavor", selection: $selectedFlavor.fl) {
            Text("Chocolate").tag(Flavor.chocolate as Flavor?)
            Text("Vanilla").tag(Flavor.vanilla as Flavor?)
            Text("Strawberry").tag(Flavor.strawberry as Flavor?)
        }
        .padding()
    }
}
补充说明

如果需要兼容iOS 13/macOS 10.15等更低版本,可以将@StateObject替换为@ObservedObject,但需要注意@ObservedObject不负责实例的生命周期,需要保证实例在视图外部被稳定持有,避免视图刷新时实例被意外重置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:36:01