You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 14:27:36