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
重新创建
在我的案例中,似乎有两种解决方法:
打开视图
短暂闪烁,然后进入第二屏幕
@状态
,但在设置布尔值打开模式后立即触发按钮中的导航更改。这对我的用例更有效,因为模式打开,当它关闭时,用户已经在下一个屏幕上了我遇到了一个类似的问题,我在看完一个完整的电影封面后试图画出一个视图。我不断得到一个错误,说视图已经被释放,因为它试图绘制到完整的屏幕封面 我使用了乔的上述提示,使这项工作。具体而言:
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协议。