Xcode 13升级后fullScreenCover初始化状态为true时不显示问题咨询
问题分析与解决方案
这个问题我之前也碰到过!其实不是你对fullScreenCover的用法有误解,这是iOS 15(对应Xcode 13)里SwiftUI在导航场景下的一个时序小坑。
为什么会出现这个情况?
当你通过NavigationLink跳转到MyView时,MyView刚完成初始化,@State var myState = true的初始值确实被设置了,但此时SwiftUI还在完成视图树的挂载和导航的过渡动画——这个阶段里,fullScreenCover的呈现逻辑还没完全准备好接收状态变化,所以初始的true信号被“漏掉”了。而你点击按钮切换两次(true→false→true)时,视图已经完全加载完成,状态变化能被fullScreenCover正确捕获,所以就能正常显示了。
解决方法
这里有两种简单有效的方案:
方案1:延迟触发初始状态
把myState初始设为false,然后在onAppear里用DispatchQueue.main.async延迟设置为true,给SwiftUI足够时间完成视图挂载:
struct MyView: View { @State var myState = false var body: some View { VStack { Button { myState.toggle() } label: {Text("toggle mustLearn")} } .fullScreenCover(isPresented: $myState, content: {Text("Test")}) .onAppear { // 延迟执行,让视图先完成初始化 DispatchQueue.main.async { myState = true } } } }
方案2:改用fullScreenCover(item:)版本
用可选值绑定的item方式替代isPresented,有时候能绕过这个时序问题:
struct MyView: View { // 用可选Bool作为触发源,初始设为true(非nil即触发) @State var shouldPresent: Bool? = true var body: some View { VStack { Button { // 切换状态:nil表示隐藏,非nil表示显示 shouldPresent = shouldPresent == nil ? true : nil } label: {Text("toggle mustLearn")} } .fullScreenCover(item: $shouldPresent) { _ in Text("Test") } } }
两种方案都能解决你的问题,选哪个看个人习惯就行~
内容的提问来源于stack exchange,提问作者Bael
相关产品推荐
相关产品推荐

