观察对象的 SwiftUI 问题
SwiftUI issues with Observed object
我在让 ObservedObject 工作时遇到问题。在此示例中,我有一个带有“主页”和“设置”选项卡的 TabView。在“设置”选项卡上,我有一个按钮可以切换一个布尔值来设置我是否购买以删除广告。
AdView 文本在 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
您可以从系统中免费获得一些这种行为。
我在让 ObservedObject 工作时遇到问题。在此示例中,我有一个带有“主页”和“设置”选项卡的 TabView。在“设置”选项卡上,我有一个按钮可以切换一个布尔值来设置我是否购买以删除广告。
AdView 文本在 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
您可以从系统中免费获得一些这种行为。