📜  ShareSheet: UIViewControllerRepresentable swiftui - Swift (1)

📅  最后修改于: 2023-12-03 15:34:57.873000             🧑  作者: Mango

ShareSheet: UIViewControllerRepresentable swiftui - Swift

当我们在SwiftUI中调用原生iOS的UIActivityViewController以展示分享弹窗时,我们需要使用 UIViewControllerRepresentable。在这篇文章中,我们将深入了解UIViewControllerRepresentable并创建我们自己的分享弹窗。

什么是 UIViewControllerRepresentable?

UIViewControllerRepresentable 是一个 SwiftUI 协议,它将一个 UIViewController 转换成 SwiftUI 视图(View)。实现该协议的类型允许我们将使用 UIKit 或其他基于原生 iOS 库构建的视图集成到 SwiftUI 中。

创建自己的分享弹窗

接下来,我们将通过创建一个 ShareSheet 视图来将 UIActivityViewController 集成到 SwiftUI 中。

struct ShareSheet: UIViewControllerRepresentable {
  let activityItems: [Any]
  let applicationActivities: [UIActivity]?

  func makeUIViewController(context: UIViewControllerRepresentableContext<ShareSheet>) -> UIActivityViewController {
    let controller = UIActivityViewController(activityItems: activityItems, applicationActivities: applicationActivities)
    return controller
  }

  func updateUIViewController(_ uiViewController: UIActivityViewController, context: UIViewControllerRepresentableContext<ShareSheet>) {
    // empty
  }
}

让我们来分解代码:

  • activityItems:这是包含了您想要与用户分享的数据的数组,例如像照片,网站链接和文本等。
  • applicationActivities:这是一组自定义的活动对象,它们为分享提供了独特的交互。例如,我们可以添加一个自定义的活动对象,以使用户可以在Facebook上分享数据。

makeUIViewController 方法中,我们将创建并返回一个 UIActivityViewController 实例。我们传入了 activityItemsapplicationActivitiesUIActivityViewController 的构造函数中。

updateUIViewController 方法中,我们只是将其保留为空,并使这个方法不执行任何操作。这是由于 UIActivityViewController 应该由 makeUIViewController 方法创建,因此不需要每次调用 updateUIViewController 都有实例创建。

调用ShareSheet视图

为了调用我们的ShareSheet视图,我们需要在我们的SwiftUI代码中使用一个sheet的修饰符进行调用,这样ShareSheet将会出现在我们的视图栈上。

struct ContentView: View {
  @State var showShareSheet = false

  var body: some View {
    Button(action: {
      self.showShareSheet.toggle()
    }, label: {
      Text("Share")
    })
    .sheet(isPresented: $showShareSheet, content: {
      ShareSheet(activityItems: ["Hello, world!"])
    })
  }
}

让我们分解上面的代码:

  • @State var showShareSheet = false:这个变量用来追踪ShareSheet 是否需要被展示。默认情况下,它被设置为false
  • Button:这个按钮用于展示当我们点击它时是否需要展示ShareSheet视图。
  • sheet 修饰符:这种修饰符实现了一个弹出式视图,在这个视图中,我们可以将ShareSheet进行展示。

现在,当我们点击"Share"按钮时,我们将看到一个弹出式视图,该视图由UIActivityViewController创建。

总结

UIViewControllerRepresentable 允许在SwiftUI中嵌入使用UIKit创建的视图。在本文中,我们了解了如何使用此协议通过创建一个分享弹窗来实现这一点。希望这篇文章对你有所帮助!