SwiftUI iOS 14 View不会使用@EnvironmentObject更新@Published数组

时间:2020-08-30 19:13:40

标签: ios arrays swiftui ios14

我正在开发一个卡路里跟踪器应用程序。 在我的应用程序中,我可以打开某些产品的“详细信息”侧,设置数量并将其添加到“购物车”中。 稍后,我想从数组中读取所有收集的数据,并向它们简要介绍。

但是在阵列上进行更改后,此视图将不会更新。 由于我使用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

1 个答案:

答案 0 :(得分:0)

我自己发现了这个错误。问题是,我在.sheet动作中提交了明确的.environmentObject。

AmountView(product: product).environmentObject(Cart())

我从.environmentObject(Cart())动作中删除了.sheet。现在可以了。

认为这是导致错误的原因,因为我在项目的主视图中使用了.environmentObject(Cart())运算符。