SwiftUI视图模态关闭检测:iPad表单视图回调及onDismiss可靠性疑问
解决iPad上FormSheet模态视图外部点击关闭不触发回调的问题
onDismiss的触发时机是可靠的:
只有当这个模态的SwiftUI视图被完全从屏幕上移除时,onDismiss才会被调用,包括三种场景:用户点击完成按钮手动关闭、点击iPad formSheet外部区域关闭、代码调用dismiss方法。
如果只是在当前SwiftUI视图的导航栈中推入新视图,原视图只是被压入导航栈(并没有消失),这种情况onDismiss不会被触发,完全不用担心误回调的问题。用onDismiss触发父控制器回调是合适的方案:
这个方案刚好能覆盖你遇到的iPad外部点击关闭不触发回调的场景——不管用户是主动完成操作还是意外点击外部关闭,onDismiss都会执行,确保父控制器能收到通知。
注意:不管你是用SwiftUI的presentationMode来dismiss,还是通过UIKit的UIHostingController调用dismiss(animated:),都会正常触发onDismiss,不会有冲突。可选优化:区分关闭原因:
如果需要区分用户是主动完成操作还是取消关闭,可以在SwiftUI视图里加一个状态变量标记操作状态,示例代码如下:struct YourModalView: View { @Environment(\.presentationMode) var presentationMode @State private var didComplete = false // 父控制器传入的回调 var onFinish: (Bool) -> Void var body: some View { VStack { Button("完成") { didComplete = true presentationMode.wrappedValue.dismiss() } // 其他视图内容 } .onDismiss { // 告诉父控制器是完成还是取消 onFinish(didComplete) } } }
内容的提问来源于stack exchange,提问作者Deepak Sharma
相关产品推荐
相关产品推荐

