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

SwiftUI中弹出两层sheet时SecondScreen内ShareSheet无法显示如何解决?

问题原因
  • 你当前调用ShareID函数时直接取UIApplication.shared.windows.first?.rootViewController作为弹出分享控制器的载体是错误的:此时根控制器已经弹出了第一层的SecondScreen sheet,处于正在present其他控制器的状态,无法再承载新的弹出层,所以点击按钮没有响应。
  • 你提供的示例代码中SecondScreen结构体的大括号数量不对,存在语法错误,需要先修正。
解决方案1:使用SwiftUI原生ShareLink(iOS 16+ 推荐)

该方案无需自己封装UIKit控制器,也不用手动处理控制器层级,系统会自动处理sheet的弹出优先级,代码最简洁:

struct SecondScreen: View {
    var body: some View {
        NavigationView {
            Form {
                Section {
                    ShareLink(item: URL(string: "https://www.google.com")!) {
                        Text("Share")
                    }
                }
            }
            .navigationTitle("第二页")
        }
    }
}

该方式下第一层sheet中的ShareLink会自动在当前sheet之上弹出分享页,iOS 16及以上版本实测正常。

解决方案2:兼容iOS 15及更低版本

如果需要支持旧系统,修正ShareID函数的控制器查找逻辑,主动找到当前最顶层的正在显示的控制器来弹出分享页即可:

func ShareID(Info: String) {
    let infoU = Info
    let av = UIActivityViewController(activityItems: [infoU], applicationActivities: nil)
    
    // 递归获取当前最顶部的显示控制器
    guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
          let rootVC = windowScene.windows.first?.rootViewController else {
        return
    }
    var topVC = rootVC
    while let presentedVC = topVC.presentedViewController {
        topVC = presentedVC
    }
    topVC.present(av, animated: true)
}

修改后点击分享按钮即可正常弹出第二层分享sheet。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:15:02