如何在SwiftUI的ShareLink视图关闭时获取通知?
ShareLink 本身没有提供直接的关闭回调接口,但可以通过两种方式实现「分享面板关闭后执行操作」的需求:
方案1:封装 UIKit 的 UIActivityViewController(支持区分分享状态)
SwiftUI 的 ShareLink 底层基于 UIActivityViewController 实现,我们可以自己封装一个 UIViewControllerRepresentable,利用 UIActivityViewController 的 completionWithItemsHandler 回调,不仅能监听面板关闭,还能区分用户是完成了分享还是直接取消:
struct CustomShareSheet: UIViewControllerRepresentable { let items: [Any] var activities: [UIActivity]? let onCompletion: (_ activityType: UIActivity.ActivityType?, _ completed: Bool) -> Void func makeUIViewController(context: Context) -> UIActivityViewController { let vc = UIActivityViewController(activityItems: items, applicationActivities: activities) vc.completionWithItemsHandler = { type, completed, _, error in onCompletion(type, completed) } return vc } func updateUIViewController(_ uiViewController: UIActivityViewController, context: Context) {} } // 使用示例 struct ContentView: View { @State private var showShare = false var body: some View { Button("分享内容") { showShare = true } .sheet(isPresented: $showShare) { CustomShareSheet(items: ["测试分享文本"]) { type, completed in if completed { print("分享成功,执行后续操作") } else { print("分享取消,执行后续操作") } // 无论成功或取消,都执行的通用操作放在这里 } } } }
方案2:利用 SwiftUI sheet 的 onDismiss(仅监听关闭)
如果不需要区分用户是完成分享还是关闭面板,只需要在面板消失后执行操作,直接用 sheet 的 onDismiss 回调即可,这种方式更简洁:
struct ContentView: View { @State private var showShareSheet = false var body: some View { Button("打开分享面板") { showShareSheet = true } .sheet(isPresented: $showShareSheet, onDismiss: { // 分享面板关闭后执行的操作 print("分享面板已关闭,开始处理后续逻辑") }) { ShareLink(item: "要分享的内容") .presentationDetents([.medium, .large]) .presentationDragIndicator(.visible) } } }
两种方案对比
- 方案1:能获取分享的详细状态(是否完成、使用了哪种分享方式),适合需要根据分享结果执行不同逻辑的场景;
- 方案2:代码更简洁,但无法区分分享状态,仅适合「只要面板关闭就执行操作」的场景。
内容的提问来源于stack exchange,提问作者Legolas Wang
相关产品推荐
相关产品推荐

