如何解决SwiftUI iOS 14 View不会使用@EnvironmentObject更新@Published数组
我正在开发一个卡路里跟踪器应用程序。 在我的应用程序中,我可以打开某些产品的“详细信息”侧,设置数量并将其添加到“购物车”中。 稍后,我想从数组中读取所有收集的数据,并向它们简要介绍。
但是在阵列上进行更改后,此视图将不会更新。 由于我使用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
解决方法
我自己发现了这个错误。问题是,我在.sheet
动作中提交了明确的.environmentObject。
AmountView(product: product).environmentObject(Cart())
我从.environmentObject(Cart())
动作中删除了.sheet
。现在可以了。
认为这是导致错误的原因,因为我在项目的主视图中使用了.environmentObject(Cart())
运算符。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。