从View中显示UIActivityViewController,如何设置sourceView

问题描述 投票:0回答:1

我正在尝试分享我的应用程序中的链接。看来我们应该使用

UIActivityViewController
来做到这一点。

这就是我正在尝试的方法:

struct ContentView: View {
    var body: some View {
       ...
       Button(action: { shareLink() } .. )
    }

    func shareLink() {
        let url = URL(string: "https://www.example.com")!
        let activityViewController = UIActivityViewController(activityItems: [url], applicationActivities: nil)
        UIApplication.shared.windows.first?.rootViewController?.present(
            activityViewController, animated: true, completion: nil)
    }
}

当我在连接的设备上运行时,我遇到崩溃:

*** 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“UIPopoverPresentationController () 应该在演示发生之前设置一个非零的 sourceView 或 barButtonItem。”

我不确定如何在这里设置

sourceView
,我发现的大多数示例都使用已弃用的方法,我不确定是否要采用这些方法或当前的方法是什么。

谢谢

ios
1个回答
0
投票

我当前显示

UIActivityViewController
的方法是创建一个符合
UIViewControllerRepresentable
的SwiftUI视图来包装UIActivityViewController,然后我们可以使用present修饰符来呈现该视图。

struct ContentView: View {
    @State var showShare: Bool = false
    var body: some View {
        Button(action: {
            showShare = true
        }) {
            Text("Share")
        }
        .sheet(isPresented: $showShare) {
            WrapUIActivityViewController(url: URL(string: "https://www.example.com")!)
        }
    }
}


struct WrapUIActivityViewController: UIViewControllerRepresentable {
    let url: URL
    func makeUIViewController(context: Context) -> UIActivityViewController {
        UIActivityViewController(activityItems: [url], applicationActivities: nil)
    }
    
    func updateUIViewController(_ uiViewController: UIActivityViewController, context: Context) {
    }
    
    typealias UIViewControllerType = UIActivityViewController
}
© www.soinside.com 2019 - 2024. All rights reserved.