无法分配给属性:将值分配给 @ObservedObject 时“self”是不可变的

Irs*_*shu 0 ios swift swiftui

struct ParentView: View {
  @ObservedObject var selectedFruit:Fruit
  @State var showingSheet = false

  var body: some View {
        VStack {
            HStack(spacing:0.6) {
                ForEach(self.viewModel.fruits, id: \.id) { record in
                    Text(record).onTapGesture {
                        self.selectedFruit = Fruit() //Cannot assign to property: 'self' is immutable
                        self.showingSheet.toggle()
                    }
                }
             }

        }.sheet(isPresented: $showingSheet,onDismiss: {
                print("reload?")
        }) { 
             DetailView(fruit: self.selectedFruit)
        }
   }
}  




struct DetailView: View {
    @ObservedObject var fruit: Fruit
    var body: some View {
        Text(fruit.text)
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试为可观察值赋值时selectedFruitParentView出现以下编译错误:

无法分配给属性:“self”是不可变的

但如果我替换@ObservedObject@State,它就有效。我怎样才能让它工作@ObservedObject?我担心,如果我使用 @State,我对该对象所做的更新DetailView将不会触发 上的更新ParentView

有人可以帮我解决这个问题吗?

Pau*_*w11 5

即使你可以变异self,你也不想这样做。

An@ObservedObject是对注入到视图中的对象实例的引用,通常来自超级视图,或者如果ParentView是根视图,则来自场景委托。

通过分配新值,您将更改此视图selectedFruit中引用的对象。但父视图仍然引用原始对象。

你的selectedFruit应该是@Published你的财产viewModel。然后你就会self.viewModel.selectedFruit = record在你的onTapGesture.

Paul Hudson 的这篇文章很好地概述了可观察对象、状态属性和环境之间的区别。