Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在SwiftUI中设置视图的ViewModel的最佳方法是什么_Ios_Swift_Xcode_Swiftui - Fatal编程技术网

Ios 在SwiftUI中设置视图的ViewModel的最佳方法是什么

Ios 在SwiftUI中设置视图的ViewModel的最佳方法是什么,ios,swift,xcode,swiftui,Ios,Swift,Xcode,Swiftui,我是MVVM的新手,想知道在显示新视图时设置新视图的ViewModel属性的最佳方法是什么 我试图在演示视图的.fullScreenCover中初始化ViewModel类,但这给我带来了各种各样的问题。这就是我所做的: struct FirstView: View { @State var isActive = false var body: some View { Text("Tap here to go to SecondView")

我是MVVM的新手,想知道在显示新视图时设置新视图的ViewModel属性的最佳方法是什么

我试图在演示视图的.fullScreenCover中初始化ViewModel类,但这给我带来了各种各样的问题。这就是我所做的:

struct FirstView: View {
    @State var isActive = false
    var body: some View {
        Text("Tap here to go to SecondView")
            .onTapGesture {
                isActive = true
            }
            .fullScreenCover(isPresented: $isActive, content: {
                SecondView(viewModel: ViewModel(), isActive: $isActive)
            })
    }
    
}
struct SecondView: View {
    @ObservedObject var viewModel: ViewModel
    
    @Binding var isActive: Bool
    
    init(viewModel: ViewModel, isActive: Binding<Bool>) {
        self.viewModel = viewModel
        self._isActive = isActive
    }
    
    var body: some View {
        Button(action: {
            $isActive = false
        }, label: {
            Text("Go back to FirstView")
        })
    }
}
struct FirstView:View{
@状态变量isActive=false
var body:一些观点{
文本(“点击此处转到第二视图”)
.ontapsigne{
isActive=true
}
.fullScreenCover(显示:$isActive,内容:{
第二视图(viewModel:viewModel(),isActive:$isActive)
})
}
}
结构第二视图:视图{
@观察对象变量viewModel:viewModel
@绑定变量是活动的:Bool
init(viewModel:viewModel,isActive:Binding){
self.viewModel=viewModel
self.\u isActive=isActive
}
var body:一些观点{
按钮(操作:{
$isActive=false
},标签:{
文本(“返回第一视图”)
})
}
}
问题是viewModel的init方法被多次调用。我不确定这是否是因为底层FirstView正在被重新绘制,尽管它不再出现在屏幕上,或者它是否与正在SecondView中访问的绑定isActive var有关。在任何情况下,都会创建如此多的ViewModel。我不知道这是为什么。但更重要的是,我想知道初始化新视图的viewModel的正确方法是什么


我现在做的是在第一个视图的viewModel中创建第二个视图的viewModel并传递引用,但这感觉非常错误。

一般来说,在初始化
视图模型时,应该使用
@StateObject
。如果您只需要在
SecondView
中使用它,则不需要将它从
FirstView
传递到
SecondView
,您可以在
SecondView
中初始化它:

struct SecondView: View {
    @StateObject var viewModel: ViewModel = ViewModel()
SecondView(viewModel: viewModel...
但是,如果您需要在第一个视图中对其进行引用,或者希望它在创建第二个视图时保持不变,则可以在父视图(
FirstView
在本例中)中使用以下命令对其进行初始化:

然后将该对象传递到子视图(
SecondView
):

正如您已经看到的,它应该是子视图中的
@ObservedObject

 @ObservedObject var viewModel: ViewModel
或者,您可以将其初始化为
@EnvironmentObject
,并将其传递到环境中,而不是通过初始化器直接从一个视图传递到另一个视图


我发现很多人在这方面有问题,所以如果你想更好地理解,我制作了一些YouTube教程:


一般来说,在初始化
视图模型时,应该使用
@StateObject
。如果您只需要在
SecondView
中使用它,则不需要将它从
FirstView
传递到
SecondView
,您可以在
SecondView
中初始化它:

struct SecondView: View {
    @StateObject var viewModel: ViewModel = ViewModel()
SecondView(viewModel: viewModel...
但是,如果您需要在第一个视图中对其进行引用,或者希望它在创建第二个视图时保持不变,则可以在父视图(
FirstView
在本例中)中使用以下命令对其进行初始化:

然后将该对象传递到子视图(
SecondView
):

正如您已经看到的,它应该是子视图中的
@ObservedObject

 @ObservedObject var viewModel: ViewModel
或者,您可以将其初始化为
@EnvironmentObject
,并将其传递到环境中,而不是通过初始化器直接从一个视图传递到另一个视图


我发现很多人在这方面有问题,所以如果你想更好地理解,我制作了一些YouTube教程:


不确定该链接是关于什么的。我不是问命名约定。我用上面的命名来说明问题。这些不是我代码中的名称。问题是如何传递视图模型。不知道该怎么称呼它。Thx.你以为你说的是“视图模型”,但实际上里面有一个空间:它是“视图模型”,视图模型。现在我们有了点这样的现代工具,术语“ViewModel”持续存在是令人困惑的。请通过改变你对这个问题的看法来帮助这个行业的发展。驼峰案例表明了一个空间。我认为这是惯例。我没有把它叫做ViewModel,我不知道这个链接是关于什么的。我不是问命名约定。我用上面的命名来说明问题。这些不是我代码中的名称。问题是如何传递视图模型。不知道该怎么称呼它。Thx.你以为你说的是“视图模型”,但实际上里面有一个空间:它是“视图模型”,视图模型。现在我们有了点这样的现代工具,术语“ViewModel”持续存在是令人困惑的。请通过改变你对这个问题的看法来帮助这个行业的发展。驼峰案例表明了一个空间。我认为这是惯例。我并没有称之为ViewModel,这正是我想要的。非常感谢。这正是我想要的。非常感谢你。