我很难弄清楚如何关闭在SwiftUI中全屏显示的视图。
在登录页面上,有一个点击重置密码选项。当用户点击那里时,会出现另一个视图。新视图的ViewModel与SignInView的ViewModel不同。
在执行了一个重置密码的异步操作后,我想关闭重置密码视图并返回到SignInView。一个缩写版本如下所示:
// SignInView
@State var isActive = false
var body: some View {
Text("Forgot Password? Tap to reset")
.onTapGesture {
isActive = true
}
.fullScreenCover(isPresented: $isActive, content: {
ResetPasswordView(viewModel: ResetPasswordViewModel(), isActive: $isActive)
})
}
// ResetPasswordView
@ObservedObject var viewModel: ResetPasswordViewModel
@Binding var isActive: Bool
init(viewModel: ResetPasswordViewModel, isActive: Binding<Bool>) {
self.viewModel = viewModel
self._isActive = isActive
}
var body: some View {
Button(action: {
viewModel.resetPassword()
}, label: {
Text("Done")
})
}
字符串
由于异步密码重置操作发生在ResetPasswordView的ViewModel中,因此我希望能够在完成后将isActive设置为false并关闭ResetPasswordView。但我不知道如何从ViewModel更改isActive,因为它直接传递到视图。
我对MVVM非常陌生,不确定我是否正确地考虑了这一点。
2条答案
按热度按时间tcomlyy61#
您已经正确绑定了
isActive
。现在只需将其设置为false
。你所需要的是在适当的地方:
字符串
一种方法是让
ViewModel
直接处理isActive
。解决方案
型
示例(使用中):
型
l2osamch2#
不要将视图的属性绑定到视图模型,视图模型应该管理视图的所有属性状态以发布到视图。
字符串