呼叫中参数“查看呼叫”的参数丢失

问题描述

我很难理解为什么我必须在调用此视图时赋予名为vm的Popup视图依赖,因为它是可观察的

 struct ContentView: View {
        @State private var showPopup1 = false
        var body: some View {
            vstack {
                Button(action: { withAnimation {  self.showPopup1.toggle()}}){
                    Text("showPopup1")  }
                Text("title")
               DetailView()  /// this line shows error
            }
           
        }
    }
    struct DetailView:View {
        @Observedobject  var vm:viewmodel
        var body : some View {
            Text("value from VM")
            
        }
    }
    class viewmodel: ObservableObject {
        @Published var title:String = ""
        
    }

解决方法

初始化视图时,必须设置vm属性。这是通常的方法。

struct ContentView: View {
    @State private var showPopup1 = false

    var body: some View {
        VStack {
            Button(action: { withAnimation {  self.showPopup1.toggle()}}){
                Text("showPopup1")  }
            Text("title")

            DetailView(vm: ViewModel()) // Initiate your ViewModel() and pass it as DetailView() parameter
        }
    }
}

struct DetailView:View {

    var vm: ViewModel

    var body : some View {
        Text("value from VM")
    }
}

class ViewModel: ObservableObject {
    @Published var title:String = ""
}

或者您可以使用@EnvironmentObject。您必须将.environmentObject(yourObject)传递到要使用Object的视图,但是同样,您必须在传递它之前对其进行初始化。

我不确定这是否是一个好方法,因为您声明了.environmentObject的视图的所有子视图都可以访问environmentObject,并且通常只需要一个ViewModel就可以使用一个视图。

struct ContentView: View {
    @State private var showPopup1 = false
    var body: some View {
        VStack {
            Button(action: { withAnimation {  self.showPopup1.toggle()}}){
                Text("showPopup1")  }
            Text("title")

            DetailView().environmentObject(ViewModel()) // Pass your ViewModel() as an environmentObject

        }
    }
}

struct DetailView:View {

    @EnvironmentObject var vm: ViewModel // you can now use your vm,and access it the same say in all childs view of DetailView

    var body : some View {
        Text("value from VM")
    }
}

class ViewModel: ObservableObject {
    @Published var title:String = ""
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...