web-dev-qa-db-fra.com

SWIFTUI Exportation ou partage de fichiers

Je me demande s'il y a un bon sens exportation ou partagez un fichier via SWIFTUI. Il ne semble pas y avoir un moyen d'envelopper une uaractivitéController et de le présenter directement. J'ai utilisé l'UIVIEWCONTROLLERREPRESENTABLE POUR ENVOYER UN UIACTICTICITYVIEWCONTROLLER, ET CLASTING SI JE, DITES, Présentez-le dans un SWIFTUI MODAL.

J'ai pu créer un UIViewController générique, puis à partir de là, appelez une méthode qui présente l'uactivitéViewController, mais c'est beaucoup d'emballage.

Et si nous voulons partager du Mac à l'aide de SWIFTUI, est-il un moyen d'envelopper NssharingServicePicker?

Quoi qu'il en soit, si quelqu'un a un exemple de la façon dont ils le font, ce serait très apprécié.

6
MScottWaller

Jetez un coup d'œil à AlanquaterMain -s SwifthacheHeetDemo

En un mot, il ressemble à ceci:

@State private var showShareSheet = false
@State public var sharedItems : [Any] = []

Button(action: {
    self.sharedItems = [UIImage(systemName: "house")!]
    self.showShareSheet = true
}) {
    Text("Share")
}.sheet(isPresented: $showShareSheet) {
    ShareSheet(activityItems: self.sharedItems)
}
struct ShareSheet: UIViewControllerRepresentable {
    typealias Callback = (_ activityType: UIActivity.ActivityType?, _ completed: Bool, _ returnedItems: [Any]?, _ error: Error?) -> Void

    let activityItems: [Any]
    let applicationActivities: [UIActivity]? = nil
    let excludedActivityTypes: [UIActivity.ActivityType]? = nil
    let callback: Callback? = nil

    func makeUIViewController(context: Context) -> UIActivityViewController {
        let controller = UIActivityViewController(
            activityItems: activityItems,
            applicationActivities: applicationActivities)
        controller.excludedActivityTypes = excludedActivityTypes
        controller.completionWithItemsHandler = callback
        return controller
    }

    func updateUIViewController(_ uiViewController: UIActivityViewController, context: Context) {
        // nothing to do here
    }
}
1
mfazekas

La plupart des solutions oublient ici de remplir la feuille d'actions sur l'iPad.

Donc, si vous avez l'intention d'avoir une application qui ne plait pas sur cet appareil, vous pouvez utiliser cette méthode sur laquelle popoverController est utilisé et ajoutez votre choix activityItems comme paramètre.

import SwiftUI

/// Share button to populate on any SwiftUI view.
///
struct ShareButton: View {

  /// Your items you want to share to the world.
  ///
  let itemsToShare = ["https://iTunes.Apple.com/app/id1234"]

  var body: some View {
    Button(action: { showShareSheet(with: itemsToShare) }) {
      Image(systemName: "square.and.arrow.up")
        .font(.title2)
        .foregroundColor(.blue)
    }
  }
}

extension View {
  /// Show the classic Apple share sheet on iPhone and iPad.
  ///
  func showShareSheet(with activityItems: [Any]) {
    guard let source = UIApplication.shared.windows.last?.rootViewController else {
      return
    }

    let activityVC = UIActivityViewController(
      activityItems: activityItems,
      applicationActivities: nil)

    if let popoverController = activityVC.popoverPresentationController {
      popoverController.sourceView = source.view
      popoverController.sourceRect = CGRect(x: source.view.bounds.midX,
                                            y: source.view.bounds.midY,
                                            width: .zero, height: .zero)
      popoverController.permittedArrowDirections = []
    }
    source.present(activityVC, animated: true)
  }
}
0
Roland Lariotte