我正在开发一个卡路里跟踪器应用程序。 在我的应用程序中,我可以打开某些产品的“详细信息”侧,设置数量并将其添加到“购物车”中。 稍后,我想从数组中读取所有收集的数据,并向它们简要介绍。
但是在阵列上进行更改后,此视图将不会更新。 由于我使用userDefaults存储数据,因此我总是必须重新打开应用程序以更新视图。只有这样,才会显示孔阵列。
我的课堂购物车:
float._init_
我做了一个视图以应用任何特殊产品的量。
import Foundation
struct Order: Equatable, Identifiable, Codable {
var id = UUID()
var product: Product
var modifier: Double
var date: Date
}
class Cart: ObservableObject {
@Published var orders = [Order]()
static let saveKey = "SavedData"
init() {
if let data = UserDefaults.standard.data(forKey: Self.saveKey) {
if let decoded = try? JSONDecoder().decode([Order].self, from: data) {
self.orders = decoded
}
} else {
self.orders = []
}
}
// save order
func save() {
if let encoded = try? JSONEncoder().encode(self.orders) {
UserDefaults.standard.set(encoded, forKey: Self.saveKey)
}
}
// add to order
func add(order: Order) {
self.orders.append(order)
print("product added to cart")
save()
}
// remove from order
func remove(order: Order) {
if let index = orders.firstIndex(of: order) {
orders.remove(at: index)
}
}
}
然后,我想使用Form和ForEach斜率在日志视图中按顺序显示所有产品。
import SwiftUI
struct AmountView: View {
@EnvironmentObject var cart: Cart
@State private var textInput = ""
@State private var orderFinished = false
var product: Product
func StringDoubleConverter(text: String) -> String {
return String(format: "%.2f", Double(textInput.replacingOccurrences(of: ",", with: ".")) ?? 0)
}
var body: some View {
VStack {
Form {
Section(header: Text("Mengenangabe")) {
// input for the amount
AmountInputView(textInput: $textInput)
if !orderFinished {
Button("Hinzufügen", action: {
orderFinished = true
hideKeyboard()
// add product to the cart
self.cart.add(order: Order(product: product, modifier: Double(StringDoubleConverter(text: textInput))!, date: Date()))
})
.disabled(textInput == "")
.animation(.default)
} else {
Text("Wurde zum Logbuch hinzugefügt")
.foregroundColor(.blue)
}
}
productNutritionCollectionView(product: product, modifier: Double(StringDoubleConverter(text: textInput))!)
}
}
}
}
struct AmountView_Previews: PreviewProvider {
static var previews: some View {
AmountView(product: Product.exampleProduct).environmentObject(Cart())
}
}
我正在使用AppTab视图浏览应用程序。因此,我将主Struct中的AppTab视图更改为带有Cart对象环境对象的默认视图。
struct LogbookView: View {
func deleteProducts(at offsets: IndexSet) {
cart.orders.remove(atOffsets: offsets)
cart.save()
}
@EnvironmentObject var cart: Cart
@State private var date = Date()
var body: some View {
NavigationView {
Form {
Section(header: Text("List")) {
ForEach(cart.orders) { order in
Text(order.product.name)
}
.onDelete(perform: { indexSet in
deleteProducts(at: indexSet)
})
}
}
.navigationBarTitle(Text("Logbuch"), displayMode: .automatic)
.navigationBarItems(trailing: DateView(date: $date))
}
}
}
struct LogbookView_Previews: PreviewProvider {
static var previews: some View {
LogbookView().environmentObject(Cart())
}
}
我正在使用.sheet打开我的AmountView
@main
struct KalorientrackerApp: App {
var body: some Scene {
WindowGroup {
AppTabView().environmentObject(Cart())
}
}
}
struct KalorientrackerApp_Previews: PreviewProvider {
static var previews: some View {
Text("Hello, World!")
}
}
我已经找到了其他一些讨论,但是这些讨论对我没有帮助。
我正在使用Xcode 12 beta 6和iOS14 beta 6
答案 0 :(得分:0)
我自己发现了这个错误。问题是,我在.sheet
动作中提交了明确的.environmentObject。
AmountView(product: product).environmentObject(Cart())
我从.environmentObject(Cart())
动作中删除了.sheet
。现在可以了。
认为这是导致错误的原因,因为我在项目的主视图中使用了.environmentObject(Cart())
运算符。