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

SwiftUI Sheet如何在Dismissal过程中防止内容淡出?

SwiftUI Sheet 内容淡出异常问题

假设Sheet的显示条件依赖于内容不为nil。当内容变为nil且Sheet隐藏时,在Sheet滑动关闭的过程中内容不会淡出。

import SwiftUI

struct ContentView: View {
    @State private var text: String?
    
    var isPresented: Binding<Bool> {
        .init {
            text != nil
        } set: { presented in
            if !presented {
                text = nil
            }
        }
    }
    
    var body: some View {
        Color.red
            .onTapGesture {
                text = "Hello, world!"
            }
            .sheet(isPresented: isPresented) {
                Text(text!)
                    .onTapGesture {
                        text = nil
                    }
                    .presentationDetents([.large])
            }
    }
}

在上述案例中,一旦text被设置为nil,Sheet就会隐藏,而Text内容无法再被渲染——因为text被强制解包了。

你可能会认为Sheet内部是根据isPresented条件性地加载内容,但如果在自定义模拟的Sheet中这么做,内容会在滑动关闭时正常淡出。可如果不采用条件性加载,始终尝试渲染内容,那么当text变为nil时,Text(text!)会触发重绘,直接导致崩溃。

我尝试过多种方案,比如用.transaction { $0.disablesAnimations = true }禁用动画,或者用.transition(.move(edge: .bottom))覆盖转场效果,但都无效,内容仍然会出现淡出异常。

内容的提问来源于stack exchange,提问作者pinglock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:06:25