奇异的SwiftUI行为:ViewModel类+@使用@Environment(\.presentationMode)时绑定中断

奇异的SwiftUI行为:ViewModel类+@使用@Environment(\.presentationMode)时绑定中断,swiftui,Swiftui,我不断发现非常奇怪的SwiftUI bug,它们只在非常特定的情况下才会弹出我终于找到了一个解决方法:将ViewModel存储在ContentView上,而不是存储在FormView上,然后将其传递到FormView struct ContentView:View{ @国家私有变量showForm=false @环境(\.presentationMode)私有变量presentationMode 私有let viewModel=viewModel() var body:一些观点{ 导航视图{ 文

我不断发现非常奇怪的SwiftUI bug,它们只在非常特定的情况下才会弹出我终于找到了一个解决方法:将ViewModel存储在ContentView上,而不是存储在FormView上,然后将其传递到FormView

struct ContentView:View{
@国家私有变量showForm=false
@环境(\.presentationMode)私有变量presentationMode
私有let viewModel=viewModel()
var body:一些观点{
导航视图{
文本(“你好”)
.navigationBarItems(尾随:尾随NavigationBarItem)
}
.表(显示:$showForm){
FormView(视图模型:self.viewModel)
}
}
私有var trailingNavigationBarItem:一些视图{
按钮(“表格”){
self.showForm=true
}
}
}
结构FormView:视图{
@观察对象变量viewModel:viewModel
var body:一些观点{
导航视图{
形式{
节(标题:文本(viewModel.Text)){
TextView(text:$viewModel.text)
.框架(高度:200)
}
节(标题:文本(viewModel.Text)){
TextField(“Text”,Text:$viewModel.Text)
}
}
}
}
}
类ViewModel:ObservableObject{
@已发布的var text=“”
init(){
打印(“此处”)
}
}
唯一的问题是,当ContentView打开时,ViewModel现在就被实例化了,即使您从未打开FormView。感觉有点浪费。尤其是当你有一个大的列表,带有指向一堆详细页面的导航链接时,这些页面现在都会在前面创建它们的呈现为表单视图的视图模型,即使你从未离开列表页面

遗憾的是,我无法将ViewModel转换为结构,因为我实际上需要(异步)改变状态,然后最终遇到
转义闭包捕获了改变的“self”参数
编译器错误。唉。所以是的,我一直在使用一个类

问题的根源仍然是FormView被实例化了两次(因为
@Environment(\.presentationMode)
),这会导致创建两个ViewModel(我的解决方法基本上是将一个副本传递给两个FormView)。但这仍然很奇怪,因为标准文本字段确实按预期工作,所以它破坏了
@Binding


在SwiftUI上仍然有很多像这样的奇怪的gotcha,我真的希望这会很快变得更简单。如果有人能解释工作表的行为,
observateObject
classes(viewmodels)、
@Environment(\.presentationMode)
@Binding
放在一起,我洗耳恭听

为什么在
ContentView
中需要
presentationMode
?这不是根视图吗?如果我将
presentationMode
放在
FormView
中,并打算关闭它,那么一切都会按预期进行。不,它不是我真正的应用程序中的根视图。请相信我,这里需要它:)ContentView被推到NavigationView上,需要能够以编程方式弹出自己。同样的问题也发生在我身上,我通过使用您的解决方案设法解决了。非常感谢。