带按钮和增加金额的SwiftUI更新模型

带按钮和增加金额的SwiftUI更新模型,swiftui,Swiftui,我想增加其抽头计数的乘积。因此,如果用户按下按钮,则需要更新模型,并且数量+=1 我尝试了以下代码,但模型没有更新金额 struct GridCell: View { @EnvironmentObject var order: Order class ViewModel: ObservableObject { let objectWillChange = PassthroughSubject<Void, Never>() @Published var produc

我想增加其抽头计数的乘积。因此,如果用户按下按钮,则需要更新模型,并且数量+=1 我尝试了以下代码,但模型没有更新金额

struct GridCell: View {
@EnvironmentObject var order: Order

class ViewModel: ObservableObject {
    let objectWillChange = PassthroughSubject<Void, Never>()

    @Published var product : Product {
        willSet {
            self.objectWillChange.send()
        }
    }

    init(product: Product) {
        self.product = product
    }

    public func increaseAmount() {
        self.product.amount += 1
        self.objectWillChange.send()
        print("\(self.product.amount) / \(self.product.id)")
    }
}

func updatePos(){
    self.viewModel.increaseAmount()
    let itempreis = viewModel.product.preis
    order.totalAmount += itempreis
    print(order.totalAmount)
}

@ObservedObject var viewModel: ViewModel

  var body: some View {
      Button(action: {
         print("TAPPED")
         self.updatePos()
      }) {
      ...
  }
}
产品

struct Product : Identifiable, Equatable, Decodable {
   var id: String
   var name: String
   let preis: Double
   var amount: Int
}
在我的打印对账单中,金额没有更新,每次我按下按钮时,值都像1。 我忘了什么?

试试这个

public func increaseCharacterStrength() {
      self.product.amount += 1
}

因为当您创建变量时,
Product
是一个结构体,
var viewproduct=self.Product
您创建的是产品的本地副本,所以
viewproduct.amount+=1
只是增加了该本地变量的数量,而不是实际模型的数量。

我认为您没有正确定义视图模型。由于我没有产品和订单的结构,我简化了模型以满足我们讨论的需要。对于下面提供的示例,您可以创建GridCell实例(如GridCell()),点击按钮将数量增加1。还请注意,可以通过在视图模型中使用@Published属性包装器而不是Passthrough来进一步简化

类顺序:ObserveObject{
@已发布var totalAmount:Int=0
}
结构产品{
var id=UUID()
风险值金额:Int=0
变量preis:Int=0
}
结构网格单元:视图{
@EnvironmentObject变量顺序:顺序
func updatePos(){
self.viewModel.increaseCharacterStrength()
设itempreis=self.viewModel.product.preis
order.totalAmount+=itempreis
//打印(订单总数)
打印(“----(self.viewModel.product.amount)/\(self.viewModel.product.id)”)
}
@ObservedObject var viewModel=viewModel(产品:product())
var body:一些观点{
按钮(操作:{
打印(“抽头”)
self.updatePos()
}) {
文本(“增加订单”)
}
}
}
类ViewModel:ObservableObject{
让objectWillChange=PassthroughSubject()
var产品:产品{
意志{
self.objectWillChange.send()
}
}
初始化(产品:产品){
self.product=产品
}
公共函数增量CharacterStrength(){
self.product.amount+=1
self.objectWillChange.send()
}
}

struct Product:identificatable,Decodable,equalable{var id:String var name:String var amount:Int}我在ViewModel类中添加了@Published var Product:Product,但没有任何更改。每次的金额仅为1。谢谢,但没有任何变化:(我以前试过这个。如果我把它改成99,金额将是99。但不是increase@xyzcodeeee我尝试了你的代码,并使用了我发布的方法,它似乎工作正常,你使用的是什么xcode版本?如果我尝试此操作,我会遇到一个错误,无法在没有参数的情况下调用类型“Product”的初始值设定项。我在一个新项目中添加了上述代码,它正常工作。请注意,在调用此之前,您需要创建环境对象并将其添加到视图中。此外,产品不应因错误而失败,因为所有内容都已给定值。当然,这仅用于我们的测试目的。我的产品看起来像struct product:可识别、可解码、可均衡{var id:String var name:String var amount:Int}是否有一个可行的演示,有你正在谈论的问题。希望你看到我的早期更新。如果我没有演示,我不知道你是如何组成视图以及如何导航视图。否则我需要假设导航路径,这可能不会给出我们想要的结果。此外,我们没有任何可取消的令牌在we store(这类主题由combine处理),据我所知,一旦我们取消对发布者的引用,关联元素就会被释放。因此,如果不考虑各种视图的工作方式,可能很难提供任何解决方案。
public func increaseCharacterStrength() {
      self.product.amount += 1
}