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