观察对象的 SwiftUI 问题

SwiftUI issues with Observed object

我在让 ObservedObject 工作时遇到问题。在此示例中,我有一个带有“主页”和“设置”选项卡的 TabView。在“设置”选项卡上,我有一个按钮可以切换一个布尔值来设置我是否购买以删除广告。

A​​dView 文本在 ObservedObject 上有一个 if 条件,但是当我切换该值时,广告文本不会消失/出现。如果我关闭应用程序并重新启动,它会正确更新。我怎样才能让它实时更新?

class Settings: ObservableObject {
@Published var purchasedRemoveAds: Bool {
    didSet {
        UserDefaults.standard.set(purchasedRemoveAds, forKey: "purchasedRemoveAds")
    }
}


init() {
    self.purchasedRemoveAds = UserDefaults.standard.bool(forKey: "purchasedRemoveAds")
  }
}

struct ContentView: View {

@State var tabSelect: Int
@ObservedObject var settings: Settings

var body: some View {
    TabView(selection: $tabSelect) {
        NavigationView {
            Home()
        }
        .tabItem {
            Image(systemName: "house")
            Text("Home")
        }
        .tag(0)
        
        NavigationView {
            SettingsView(settings: Settings())
        }
        .tabItem {
            Image(systemName: "gearshape")
            Text("Settings")
        }
        .tag(1)
    }
    
    //Show Ads at bottom of screen
    if !settings.purchasedRemoveAds {
        Text("AdView here").frame(height: 50).frame(maxWidth: .infinity).background(Color.green)
    }
    Spacer()
  }
}

struct SettingsView: View {
@ObservedObject var settings: Settings

var body: some View {
    List {
        
        Section(header: Text("In-App Purchases")) {
            Button {
                settings.purchasedRemoveAds.toggle()
            } label: {
                Text("Remove Ads")
            }
        }.listRowBackground(Color.gray.opacity(0.1))
    
    }
    .navigationTitle("Settings")
}

}

在这一行中,您正在创建一个 新实例 Settings:

SettingsView(settings: Settings())

因为这个Settings的实例是在开关改变之前实例化的,它不知道UserDefaults已经被调整了。

改为传递现有实例:

SettingsView(settings: settings)

另外,查看 @AppStorage 您可以从系统中免费获得一些这种行为。