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

SwiftUI开发:如何在已弹出的presented sheet中打开Share Sheet

不需要将分享意图传递给BaseView,也不需要先关闭SheetView,你可以直接在SheetView内实现分享Sheet唤起,以下是两种可行方案:

问题根因

你之前的代码失效的核心原因是:当SheetView已经被弹出时,根视图控制器rootViewController已经处于presented状态,系统不允许同一个视图控制器同时弹出两个新的控制器,所以调用present会被系统忽略。

方案1:兼容iOS 15及更早版本的UIKit方案

你可以先扩展UIApplication获取当前应用的顶层视图控制器,再用顶层控制器弹出分享Sheet:

  1. 新增全局扩展
extension UIApplication {
    /// 获取当前应用的顶层视图控制器
    static func topViewController() -> UIViewController? {
        guard let window = shared.windows.first, var rootVC = window.rootViewController else {
            return nil
        }
        // 循环查找最上层的弹出控制器
        while let presentedVC = rootVC.presentedViewController {
            rootVC = presentedVC
        }
        return rootVC
    }
}
  1. 修改SheetView内的分享按钮逻辑
struct SheetView: View {
    @Binding var showSheetView: Bool

    var body: some View {
        Button(action: {
            let url = URL(string: "https://apple.com")!
            let av = UIActivityViewController(activityItems: [url], applicationActivities: nil)
            // 用顶层控制器弹出分享Sheet
            UIApplication.topViewController()?.present(av, animated: true)
        }) {
            Text("Share Me")
        }
    }
}

方案2:iOS 16+原生SwiftUI方案

如果你的项目最低适配iOS 16或更高版本,可以直接使用SwiftUI原生的ShareLink组件,无需处理UIKit控制器层级,不管在主页面还是Sheet内都可以直接运行:

struct SheetView: View {
    @Binding var showSheetView: Bool

    var body: some View {
        ShareLink(item: URL(string: "https://apple.com")!) {
            Text("Share Me")
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:24:00