Я использую @AppStorage и UserDefaults для обновлений в SwiftUI. Если я внесу изменения в соревнование с оболочкой @AppStorage, все будет работать нормально. Я не понимаю, как заставить эту работу работать в глобальном масштабе.
Я использую структуру, которая имеет вычисленные свойства и связанные средства форматирования. Идея состоит в том, чтобы проверить настройки пользователя по умолчанию и преобразовать единицы в фунты или кг. Проблема в том, что представления, использующие вычисленные свойства, не обновляются при обновлении UserDefaults. Есть ли способ создать глобальное изменение, которое обновило бы weightFormatted в SecondaryView ниже?
// Весовая структура
struct Weight {
var weight: Double
var weightFormatted: String {
return weightDecimalLbsOrKgFormatted2(weight)
}
// Метод форматирования
func weightDecimalLbsOrKgFormatted2(_ lbs: Double) -> String {
if (!UserDefaults.standard.bool(forKey: "weightInKilograms")) {
let weightString = decimalFormatterDecimal2(lbs)
return weightString + "lbs"
} else {
let kg = toKg(lbs)
let weightString = decimalFormatterDecimal2(kg)
return weightString + "kg"
}
}
// Где установлен вес в килограммах
struct AccountView: View {
@AppStorage("weightInKilograms") var weightInKilograms = false
let weight = Weight(weight: 9.0))
var body: some View {
VStack {
Text(weight.weightFormatted)
Toggle(isOn: $weightInKilograms) {
Text("Kilograms")
}
}
}
}
// Дополнительный вид не обновляется
struct SecondaryView: View {
let weight = Weight(weight: 9.0))
var body: some View {
Text(weight.weightFormatted)
}
}