SwiftUI中弹出两层sheet时SecondScreen内ShareSheet无法显示如何解决?
问题原因
- 你当前调用
ShareID函数时直接取UIApplication.shared.windows.first?.rootViewController作为弹出分享控制器的载体是错误的:此时根控制器已经弹出了第一层的SecondScreen sheet,处于正在present其他控制器的状态,无法再承载新的弹出层,所以点击按钮没有响应。 - 你提供的示例代码中SecondScreen结构体的大括号数量不对,存在语法错误,需要先修正。
该方案无需自己封装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
相关产品推荐
相关产品推荐

