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
相关产品推荐
相关产品推荐

