Swiftui 导航链接没有';在解除全屏掩护后不要开火

Swiftui 导航链接没有';在解除全屏掩护后不要开火,swiftui,Swiftui,我在一个视图中有一个按钮(在导航视图中),它打开了一个全屏封面,即在处理某些数据时的加载屏幕。当封面被取消时,我希望以编程方式自动路由到下一个视图。我正在使用带有标记和选择绑定的NavigationLink,当封面被解除时,绑定值会更新,但除非我再次点击相同的“打开模式”按钮,否则路由不会发生 导入快捷界面 结构OpenerView:视图{ @EnvironmentObject变量viewModel:OpenerViewModel @国家私有变量选择:Int?=nil @国家私有var pres

我在一个视图中有一个按钮(在
导航视图
中),它打开了一个全屏封面,即在处理某些数据时的加载屏幕。当封面被取消时,我希望以编程方式自动路由到下一个视图。我正在使用带有标记和选择绑定的
NavigationLink
,当封面被解除时,绑定值会更新,但除非我再次点击相同的“打开模式”按钮,否则路由不会发生

导入快捷界面
结构OpenerView:视图{
@EnvironmentObject变量viewModel:OpenerViewModel
@国家私有变量选择:Int?=nil
@国家私有var presentLoadingScreen=false
var body:一些观点{
VStack{
导航链接(目标:SecondScreen(),标记:1,选择:$selection){EmptyView()}
按钮(操作:{
viewModel.frequency=0
self.presentLoadingScreen.toggle()
},标签:{
正文(“公开封面”)
}).buttonStyle(PlainButtonStyle())
}
.navigationBarTitle(“导航标题”,显示模式:。内联)
.全屏封面(显示:$presentLoadingScreen,onDismiss:{
自我选择=1
},内容:ModalView.init)
}
}
结构ModalView:视图{
@环境(\.presentationMode)变量presentationMode
var body:一些观点{
文本(“你好”)
奥纳佩尔先生{
DispatchQueue.main.asyncAfter(截止日期:.now()+2.0){
presentationMode.wrappedValue.Disclease()
}
}
}
}
我第一次按下按钮,盖子就打开了。封面内只有一个
DispatchQueue.main.asyncAfter
,它在2秒钟后将其解封。当它被解除时,
onDismiss
将启动,但我必须再次按下按钮以转到
SecondScreen

有什么想法吗


编辑:添加了模态视图我对代码做了一些修改,我在这里分享了我认为正在发生的事情

我认为问题在于使用
@State
布尔值来切换封面和导航的竞争条件。取消封面时,将重新创建我的主
OpenerView
——状态将发生变化。因此,我尝试设置
@State var selection
以触发导航更改,但在它这样做之前,视图将使用
selection=nil
重新创建

在我的案例中,似乎有两种解决方法:

  • 将cover boolean移动到我的视图模型-这是可行的,但我不希望它出现在那里,因为它只应用于此视图,并且它是此用户流的共享视图模型。另外,当模式解除时,您会看到当前的
    打开视图
    短暂闪烁,然后进入
    第二屏幕
  • 将封面布尔值保持在
    @状态
    ,但在设置布尔值打开模式后立即触发按钮中的导航更改。这对我的用例更有效,因为模式打开,当它关闭时,用户已经在下一个屏幕上了

  • 我遇到了一个类似的问题,我在看完一个完整的电影封面后试图画出一个视图。我不断得到一个错误,说视图已经被释放,因为它试图绘制到完整的屏幕封面

    我使用了乔的上述提示,使这项工作。具体而言:

    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
        viewToShow()
    }
    

    我以前试过onChange、onDisappear和onAppear,但没有一个适合我需要的用例。

    适用于Xcode 12.1/iOS 14.1。我使用的是Xcode 12.3和iOS 14.3,但不起作用。适用于12.3和iOS 14.3。如何取消全屏显示?在全屏显示的onAppear中,我运行
    DispatchQueue.main.asyncAfter
    2秒,它调用
    presentationMode.wrappedValue.Disclose()
    。而
    .fullScreenCover
    正在启动
    onDismiss
    ,因为我可以在那里打印出来。为了避免重画,您可以在应该避免重画的视图上实现Equals协议。