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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:20:36