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
相关产品推荐
相关产品推荐

