【问题标题】:SwiftUI @ObservedObject & @StateObject won't Update UI, some UI not showing up randomlySwiftUI @ObservedObject & @StateObject 不会更新 UI,一些 UI 不会随机显示
【发布时间】:2022-01-03 15:00:01
【问题描述】:

我遇到了一个问题,我将项目附加到 ViewModel 中的 @Published var 结构。 问题是:我附加的当前项目不会显示在购物车视图中,但数据实际上已附加,当我添加第二个项目时,购物车视图将显示我之前附加的第一个项目,或者如果您切换视图然后 UI 显示。在添加事件中,我放置了 dispatchque.main.asyc {}。这个问题是随机出现的,不知道怎么回事。我在谷歌上搜索并怀疑它与主线程有关,那是我在每个按钮事件中添加了 dispatchque,main.async。但它仍然发生。

我的代码遵循 MVVM 模式。

struct DrinkMenu: Identifiable,Codable {
    var id = UUID().uuidString
    var title : String
    var image: String
    var drink : [DrinkModel]
    
    
}

struct DrinkModel : Identifiable,Codable {
    var id = UUID()
    var hasVariantSize : Bool
    var drinkName : String
    var price : Double
    var type : DrinkTypes
    var image : String
}

class OrderViewModel : ObservableObject {
@Published var cartDrinks : [CartDrinkVM] = []
func orderDrinks(name: String,price: Double,extra: String,extraPrice: Double,currentSize: String) {
        
        
        self.cartDrinks.append(CartDrinkVM(name:"\(currentSize)\(name)", price: price, extra: [DrinkExtra(extra: extra, price: extraPrice)], unit: 1, date: Date()))
        
    }
}

在视图中有两种添加项目的方法

1: if drink sell by bottle : i use hasVariant Bool to indicate
DispatchQueue.main.async {
                                withAnimation {
                                    if drink.hasVariantSize {
                                        showDrinkCardView.toggle()
                                        orderData.currentDrink = drink
                                        
                                    } else {

                                        orderData.orderDrinks(name: drink.drinkName, price: drink.price, extra: "", extraPrice: 0, currentSize: "")
                                    }

                                }
                            }
2: hasVariant size then showing secondary menu to add, with some extras requirement. code in secondary menu: 
DispatchQueue.main.async {
                            withAnimation {
                                orderData.orderDrinks(name: drink.drinkName, price: drink.price, extra: CurrentExtra.extra, extraPrice: CurrentExtra.price, currentSize: CurrentSizeSelcted)
                                    show.toggle()
                            }
                        }




这是饮料的二级菜单,如果没有大小,它只是添加到购物车中。 该应用程序的布局非常简单,左边是购物车视图,右边是浏览项目视图。它遵循 NavigationView 结构。

drinkVM 的代码:


struct CartDrinkVM : Identifiable,Codable {
    var id = UUID()
    var name : String
    var price : Double
    var extra : [DrinkExtra]
    var unit : Int
    var date : Date
}

struct DrinkExtra : Codable,Hashable {
    var extra : String
    var price : Double
}
what I did it 
transferring data from DrinkModel to DrinkVM plus extra options. 

func orderDrinks(name: String,price: Double,extra: String,extraPrice: Double,currentSize: String) {
        
        
        self.cartDrinks.append(CartDrinkVM(name:"\(currentSize)\(name)", price: price, extra: [DrinkExtra(extra: extra, price: extraPrice)], unit: 1, date: Date()))
        
    }


【问题讨论】:

  • 什么是CartDrinkVM
  • CartDrinkVM 是另一个保存附加项目的结构,因为 Spirits 有混合器。我的 DrinkModel 用于浏览目的,它没有混音器选项。这是造成问题的原因吗?在两个结构之间转换数据?
  • 在您的视图中显示CartDrinkVM 的代码以及您对OrderViewModel 所做的操作。
  • @workingdog 我现在已经包含了 CartDrinkVM 代码。在我浏览的 Drink 视图中,我有 ObservedObject 来访问 ViewModel。此注入将所有视图返回到 Home View 中的 StateObject。
  • 什么是DrinkMenuDataView 的任何地方都没有观察到

标签: ios xcode swiftui


【解决方案1】:

我找不到解决方案,但我找到了解决此问题的方法。 因为我的视图堆叠在导航视图下。每次添加一个数据时,我都会切换到视图 2 并返回原始视图。没有奇怪的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多