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

SwiftUI中UIActivityController无法显示打印图片问题排查

问题原因

你错误地将UIActivityViewController的SwiftUI包装器放在了sheet中展示。sheet是SwiftUI用于展示自定义SwiftUI视图的容器,而UIActivityViewController是UIKit体系下的模态视图控制器,需要通过UIKit的present方法触发,直接嵌套在sheet里会导致系统无法正确加载分享内容,最终显示空白面板。

解决方案一:兼容iOS 13+ 的通用实现

通过获取当前活跃的UIKit视图控制器,直接present分享面板,无需依赖SwiftUI的sheet:

  1. 添加工具扩展获取当前视图控制器:
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
    }
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 06:45:06