SwiftUI中UIActivityController无法显示打印图片问题排查
问题原因
你错误地将UIActivityViewController的SwiftUI包装器放在了sheet中展示。sheet是SwiftUI用于展示自定义SwiftUI视图的容器,而UIActivityViewController是UIKit体系下的模态视图控制器,需要通过UIKit的present方法触发,直接嵌套在sheet里会导致系统无法正确加载分享内容,最终显示空白面板。
解决方案一:兼容iOS 13+ 的通用实现
通过获取当前活跃的UIKit视图控制器,直接present分享面板,无需依赖SwiftUI的sheet:
- 添加工具扩展获取当前视图控制器:
extension UIApplication { static func currentViewController() -> UIViewController? { let keyWindow = shared.connectedScenes .filter { $0.activationState == .foregroundActive } .compactMap { $0 as? UIWindowScene } .first? .windows .first { $0.isKeyWindow } return keyWindow?.rootViewController?.presentedViewController ?? keyWindow?.rootViewController } }
- 修改ContentView的按钮逻辑:
struct ContentView: View { var body: some View { NavigationStack { Text("Hello, World!") VStack { Button(action: { guard let image = UIImage(named: "profile") else { print("Image not found") return } let activityVC = UIActivityViewController(activityItems: [image], applicationActivities: nil) if let currentVC = UIApplication.currentViewController() { currentVC.present(activityVC, animated: true) } }, label: { Text("Print") }) } } } }
解决方案二:iOS 16+ 原生SwiftUI实现
如果你的应用只需要支持iOS 16及以上版本,可以直接使用SwiftUI原生的ShareLink,代码更简洁:
struct ContentView: View { private var shareImage: UIImage? { UIImage(named: "profile") } var body: some View { NavigationStack { Text("Hello, World!") VStack { if let image = shareImage { ShareLink( item: image, preview: SharePreview("Profile Image", image: image) ) { Text("Print") } } else { Text("Image not found") } } } } }
内容的提问来源于stack exchange,提问作者iosdev1111
相关产品推荐
相关产品推荐

