我需要:我有一个步进器来设置一个值。如果用户使用具有不同单位的应用程序,则此值完全不同。
问题是什么:当我使用设置选项卡中的单位选择器时,主选项卡中的值(在设置选项卡中存储为 @AppStorage)会正确更新。当我触摸步进器并修改主选项卡中的值时,如果我尝试修改设置选项卡中的单位,一切都会变得一团糟!(虽然设置选项卡中的值不断正确更新,但主选项卡中显示的值却没有)。
设置标签:类别
Defaults: ObservableObject {
@AppStorage("appUnits") var appUnits: String = "🇪🇺"
@AppStorage("memorizedDensity") var density: Double = 0.794
}
struct settings: View {
@ObservedObject var defaults = Defaults()
var body: some View {
List {
Section {
HStack {
ViewThatFits {
Text("App default Units")
}
Spacer(minLength: 10)
Picker(selection: $defaults.appUnits, label: Text("Unit")) {
ForEach(["🇪🇺", "🇺🇸"], id: \.self) {riga in
Text(riga)
}
}
.onChange(of: defaults.appUnits) {newValue in
if newValue == "🇪🇺" {
defaults.density = 0.793
} else if newValue == "🇺🇸" {
defaults.density = 6.66
}
// I need to set a different value when the unit changes
print(defaults.density)
}
.frame(width: 120)
.pickerStyle(.segmented)
}
}
}
}
}
主标签:
struct stepper: View {
@ObservedObject var defaults = Defaults()
var body: some View { fuelDatas }
var fuelDatas: some View {
VStack {
Text("Fuel density")
HStack {
Text(defaults.density, format: .number.precision(.fractionLength(defaults.appUnits == "🇪🇺" ? 3 : 2)))
Text(defaults.appUnits == "🇪🇺" ? "g/ml" : "lb/US gal")
}
Stepper("", value: defaults.$density, in: defaults.appUnits == "🇪🇺" ? 0.750...0.850 : 6...7, step: defaults.appUnits == "🇪🇺" ? 0.001 : 0.01)
.frame(width: 50.0)
}
}
}
我知道我在绑定方面搞砸了一些东西,我可能创建了 2 个事实来源,但我找不到代码中有什么问题!这是示例项目-
@AppStorage
理想情况下,您应该只在 s 中声明sView
,而不是将它们包装在另一个Defaults
类中。如果您从中去除这两个视图
TabView
,那么您的当前视图实际上是有效的,因此这似乎是具有的那些特性之一TabView
。如果由于某种原因您确实想要一个
Defaults
对象,那么实现这一点的一种方法就是确保所有视图都使用同一个对象。在您的选项卡视图中,声明
@StateObject
并将其传递给步进器和设置。您也可以将其作为
@EnvironmentObject
,