模型中用户默认值的SwiftUI问题

模型中用户默认值的SwiftUI问题,swiftui,userdefaults,observedobject,Swiftui,Userdefaults,Observedobject,我在学迅捷。我从做Apple SwiftUI教程开始。在其中一个项目中,他们提供了@EnvironmentalObject来对模型进行更改,他们正在更改isFavoritebool状态。 但是他们没有使用带有用户默认值的@ObservedObject,当我重新加载我的应用程序时,所有更改都不快。我已经学会了如何对视图中的值使用UserDefaults,现在我可以在对象列表中设置只显示IsFavorite对象或所有对象,当我重新加载应用程序时,这个切换按钮正在保存我的更改 但是我想在编辑我的模型时

我在学迅捷。我从做Apple SwiftUI教程开始。在其中一个项目中,他们提供了@EnvironmentalObject来对模型进行更改,他们正在更改isFavoritebool状态。 但是他们没有使用带有用户默认值的@ObservedObject,当我重新加载我的应用程序时,所有更改都不快。我已经学会了如何对视图中的值使用UserDefaults,现在我可以在对象列表中设置只显示IsFavorite对象或所有对象,当我重新加载应用程序时,这个切换按钮正在保存我的更改

但是我想在编辑我的模型时做同样的事情

这是我的模型:

import SwiftUI
import CoreLocation

struct City: Hashable, Codable, Identifiable {
var id: Int
var country: String
var name: String
var description: String
fileprivate var imageName: String
fileprivate var coordinates: Coordinates
var state: String
var people: Int
var area: Int
var continent: Continent
var isFavorite: Bool
var isFeatured: Bool


var locationCoordinate: CLLocationCoordinate2D {
    CLLocationCoordinate2D(
        latitude: coordinates.latitude,
        longitude: coordinates.longitude)
}

enum Continent: String, CaseIterable, Codable, Hashable {
    case europe = "Europe"
    case asia = "Asia"
    case america = "America"
}
}
还有一个文件,我从JSON文件(从苹果教程复制)加载数据

%%以及我如何更改“isFavorite”值

   Button(action: {
                self.userData.city[self.cityIndex].isFavorite.toggle();
                print(String(self.city.isFavorite));

            }) {
                if self.userData.city[self.cityIndex].isFavorite {
                    Image(systemName: "star.fill")
                        .foregroundColor(Color.yellow)
                } else {
                    Image(systemName: "star")
                        .foregroundColor(Color.gray)
                }
            }
我试图在UserDefault.standard.object中embend CityData,但没有成功。我肯定是做错了什么。你能帮我吗


SwiftUI的
@已发布的
对于您想要做的事情来说不够聪明

您正在与数组一起使用
@Published
。但是您以后不会分配给数组,您只需访问它的一个元素并修改它
@Published
从未看到更改,因为未对已发布变量进行赋值。因此不会触发重新渲染


在更改数组元素以触发重新渲染之前,请调用
self.userData.objectWillChange.send()

我在'self.userData.city[self.cityIndex].isFavorite.toggle();`但它不起作用。我做得对吗?乍一看应该是这样,但如果没有,那么就没有了。我不知道为什么没有一个完整的示例来执行。
**%% in UserData.swift file %%**

final class UserData: ObservableObject {
@Published var city = CityData
}

**%And in my view %%**

struct CityList: View {
@EnvironmentObject private var userData: UserData
@ObservedObject var SettingsVM = SettingsViewModel()

var body: some View {
    NavigationView {
        List {
            Toggle(isOn: $SettingsVM.showFavoritesOnly) {
                Text("Show Favorites Only")
            }

            ForEach(userData.city) { City in
                if !self.SettingsVM.showFavoritesOnly || City.isFavorite {
                    NavigationLink(
                        destination: ContentView(city: City)
                            .environmentObject(self.userData)
                    )
                    {
                        CityRow(city: City)
                    }
                }
            }
        }
        .navigationBarTitle(Text("Capitals"))
    }
}
}
   Button(action: {
                self.userData.city[self.cityIndex].isFavorite.toggle();
                print(String(self.city.isFavorite));

            }) {
                if self.userData.city[self.cityIndex].isFavorite {
                    Image(systemName: "star.fill")
                        .foregroundColor(Color.yellow)
                } else {
                    Image(systemName: "star")
                        .foregroundColor(Color.gray)
                }
            }