SwiftUI QLPreviewController nutzen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • SwiftUI QLPreviewController nutzen

    Hallo Zusammen,

    ich habe eine ältere App für iOS (13.2) die den QLPreviewController nutzt. hier kann ich PDF Dokumente mit Notizen versehen. Dieses Editieren Funktionen anscheinend mit dem Zusammenspiel mit PencilKit Alles kein Problem. Funktioniert wunderbar. Jetzt habe ich ein neues Projekt, welches wir mit SwiftUI (14.0) umsetzen möchten. Bisher konnten wir alle Aufgaben auch mit SwiftUI lösen. Nebenbei, es macht auch Spass mit SwiftUI zu arbeiten. Jetzt mein Problem, Ich kann bekannte Datentypen entsprechend anzeigen. Was nicht funktioniert, das Editieren aktiviert. in dem DataSource/delegate wird aufgerufen. Die Toolbar mit den Symbol für das Editieren fehlt. Jett habe ich zwei Fragen, die erste ist eine Verständnis - Frage zu SwiftUI: kapselt SwiftUI nicht vorhanden fertige Sachen, die auch in UIKit sind, oder wird alles neu implementiert von Apple, was ich nicht glaube. Meine zweite Frage: Kann man vielleicht SwiftUI hier umgehen und bestimmte Teile einer App weiter mit UIKit realisieren, wenn es kein Workaround für das Problem mit SwiftUI gibt.

    Vielen Dank für euren Gehirnschmalz.

    LG
    Anbei mal ein Auszug aus meinen test-Projekt für SwiftUI:

    Quellcode

    1. import SwiftUI
    2. struct ContentView: View {
    3. // force unwrap the optional, because the test file has to be in the bundle
    4. let fileUrl = Bundle.main.url(forResource: "LoremIpsum", withExtension: "pdf")!
    5. @State private var showingPreview = false
    6. var body: some View {
    7. Button("Preview File") {
    8. self.showingPreview = true
    9. }
    10. /*
    11. .fullScreenCover(isPresented: $showingPreview, content: FullScreenModalView.init){
    12. VStack(spacing: 0) {
    13. HStack {
    14. Button("Done") {
    15. self.showingPreview = false
    16. }
    17. Spacer()
    18. }
    19. .padding()
    20. //PreviewController(url: self.fileUrl)
    21. }
    22. }
    23. */
    24. .fullScreenCover(isPresented:$showingPreview) {
    25. VStack(spacing: 0) {
    26. HStack {
    27. Button("Done") {
    28. self.showingPreview = false
    29. }
    30. Spacer()
    31. }
    32. .padding()
    33. PreviewController(url: self.fileUrl)
    34. }
    35. }
    36. }
    37. }
    Alles anzeigen




    Quellcode

    1. import SwiftUI
    2. import QuickLook
    3. struct PreviewController: UIViewControllerRepresentable {
    4. let url: URL
    5. func makeUIViewController(context: Context) -> QLPreviewController {
    6. let controller = QLPreviewController()
    7. controller.dataSource = context.coordinator
    8. controller.delegate = context.coordinator
    9. controller.setEditing(true, animated: false)
    10. return controller
    11. }
    12. func updateUIViewController(_ uiViewController: QLPreviewController, context: Context) {
    13. if context != nil {
    14. print(context.coordinator)
    15. }
    16. uiViewController.setEditing(true, animated: false)
    17. }
    18. func makeCoordinator() -> Coordinator {
    19. return Coordinator(parent: self)
    20. }
    21. class Coordinator: NSObject,QLPreviewControllerDelegate,QLPreviewControllerDataSource {
    22. //var description: String
    23. let parent: PreviewController
    24. init(parent: PreviewController) {
    25. self.parent = parent
    26. }
    27. func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
    28. return 1
    29. }
    30. func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
    31. return parent.url as NSURL
    32. }
    33. func previewController(_ controller: QLPreviewController, editingModeFor previewItem: QLPreviewItem) -> QLPreviewItemEditingMode {
    34. return .updateContents
    35. }
    36. func previewController(_ controller: QLPreviewController, didUpdateContentsOf previewItem: QLPreviewItem) {
    37. print("didUpdateContentsOf")
    38. }
    39. func previewController(_ controller: QLPreviewController, didSaveEditedCopyOf previewItem: QLPreviewItem, at modifiedContentsURL: URL) {
    40. let documentsDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    41. let currentTimeStamp = String(Int(NSDate().timeIntervalSince1970))
    42. let destinationUrl = documentsDirectoryURL.appendingPathComponent("newFile\(currentTimeStamp).\(modifiedContentsURL.pathExtension)")
    43. print(destinationUrl.path)
    44. if FileManager.default.fileExists(atPath: destinationUrl.path) {
    45. debugPrint("The file already exists at path")
    46. }
    47. else{
    48. do {
    49. try FileManager.default.moveItem(at: modifiedContentsURL, to: destinationUrl)
    50. print("File moved to documents folder")
    51. } catch let error as NSError {
    52. print(error.localizedDescription)
    53. }
    54. }
    55. }
    56. }
    57. }
    Alles anzeigen
    Si tacuisses, philosophus mansisses !
  • FRing schrieb:

    Frage zu SwiftUI: kapselt SwiftUI nicht vorhanden fertige Sachen, die auch in UIKit sind, oder wird alles neu implementiert von Apple, was ich nicht glaube.
    Meine zweite Frage: Kann man vielleicht SwiftUI hier umgehen und bestimmte Teile einer App weiter mit UIKit realisieren, wenn es kein Workaround für das Problem mit SwiftUI gibt.

    FRing schrieb:

    Das mache ich schon teilweise so, sieh meine zweite Quellcode. Aber Danke für den Hinweis.

    Deine Zweite Frage hast Du dir ja bereits selbst beantwortet :)

    Zur ersten, teils - teils. Teilweise ist UIKit in SwiftUI gekapselt, teilweise ist es neu implementiert und was halt auch häufig vorkommt, dass es noch nicht implementiert ist. Dan gibt es 3 Möglichkeiten

    • andere Lösung suchen
    • selbst kapseln
    • das erwünschte Verhalten, unabhängig neu implementieren.


    Schöne Grüsse
    Wolf
  • FRing schrieb:

    Ich sehe schon, das SwiftUI nicht unbedingt die erste Wahl ist, wenn man ein Projekt jetzt so gut wie möglich umsetzen möchte. Vielen Dank für das Brainstorming.
    Wer sagt denn das? Du wählst einfach dein primäres Framework für das UI und bindest das andere ein, wenn du möchtest. Das schöne dran ist doch, dass das alles durchlässig ist. Du verwendest einfach das was passt...

    Schöne Grüße
    Wolf