SwiftUI开发:如何在已弹出的presented sheet中打开Share Sheet
不需要将分享意图传递给BaseView,也不需要先关闭SheetView,你可以直接在SheetView内实现分享Sheet唤起,以下是两种可行方案:
问题根因
你之前的代码失效的核心原因是:当SheetView已经被弹出时,根视图控制器rootViewController已经处于presented状态,系统不允许同一个视图控制器同时弹出两个新的控制器,所以调用present会被系统忽略。
方案1:兼容iOS 15及更早版本的UIKit方案
你可以先扩展UIApplication获取当前应用的顶层视图控制器,再用顶层控制器弹出分享Sheet:
- 新增全局扩展
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 } }
- 修改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
相关产品推荐
相关产品推荐

