PDF zeichnen und speichern

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

  • PDF zeichnen und speichern

    Seit tagen versuche ich eine PDF Dokument zu erstellen, die Seite zu zeichnen und das Dokument zu speichern. Die einzelnen Elemente davon sind mir klar, aber das ganze zusammen zu bauen, damit habe ich noch Mühe und ein paar Fragen dazu.

    // FRAGE:
    - was muss in PrintFormatter rein?
    - Wie kann ich den Dateinamen ändern
    - wo Muss ich meinen Inhalt zeichnen
    - Wenn ich in einer anderen Methode zeichne, was muss ich dann für ein Objekt zurück geben? attributed String? Und wenn ja, was mache idh dann damit?

    Siehe Quelltext und die Fragen dort

    Danke im voraus für die Hilfe


    Quellcode

    1. import Foundation
    2. import UIKit
    3. class PdfErstellung {
    4. static func PdfErstellen(_ auswahlZeilen : [LebensmittelDataTV], _ vitalstoffWerteListe : [LebensmittelDataTV], _ heuteString : String) {
    5. let formatter = UIMarkupTextPrintFormatter(markupText: textView.text)
    6. // FRAGE: was muss hier rein?
    7. let render = UIPrintPageRenderer()
    8. render.addPrintFormatter(formatter, startingAtPageAt: 0)
    9. let page = CGRect(x: 0, y: 0, width: 595.2, height: 841.8) // A4, 72 dpi
    10. let printable = page.insetBy(dx: 0, dy: 0)
    11. render.setValue(NSValue(cgRect: page), forKey: "paperRect")
    12. render.setValue(NSValue(cgRect: printable), forKey: "printableRect")
    13. // 4. Create PDF context and draw
    14. let rect = CGRect.zero
    15. let pdfData = NSMutableData()
    16. UIGraphicsBeginPDFContextToData(pdfData, rect, nil)
    17. for i in 1...render.numberOfPages {
    18. UIGraphicsBeginPDFPage();
    19. let bounds = UIGraphicsGetPDFContextBounds()
    20. render.drawPage(at: i - 1, in: bounds)
    21. // Frage1: MUSS das zeichnen HIER STATTFINDEN? oder woanders?
    22. // Frage2: Wenn ich in einer anderen Methode zeichne, was muss ich dann für ein Objekt zurück geben? attributed String? Und wenn ja, was mache idh dann damit?
    23. attributedString = DrawPDF(auswahlZeilen, vitalstoffWerteListe, heuteString)
    24. }
    25. let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
    26. // Frage: kann ich so das Datum in den Filename einfügen? (den String ersetzt ich in Zukunft mit einer Variable, die ich übergeben bekomme)
    27. let datum : String = " 20.09.2018"
    28. pdfData.write(toFile: "\(documentsPath)/Vitalstroffcontroller/Vitalstoffliste\(datum) new.pdf", atomically: true)
    29. print("saved success")
    30. }
    31. static func DrawPDF(_ auswahlZeilen : [LebensmittelDataTV], _ vitalstoffWerteListe : [LebensmittelDataTV], _ heuteString : String) -> NSAttributedString {
    32. var y = 0
    33. var stringReckteckX50 = CGRect(x: 50, y: y, width: 100, height: 20)
    34. var stringReckteckX160 = CGRect(x: 160, y: y, width: 30, height: 20)
    35. var stringReckteckX170 = CGRect(x: 170, y: y, width: 10, height: 20)
    36. var stringReckteckX220 = CGRect(x: 220, y: y, width: 100, height: 20)
    37. var stringReckteckX330 = CGRect(x: 330, y: y, width: 30, height: 20)
    38. var stringReckteckX340 = CGRect(x: 340, y: y, width: 10, height: 20)
    39. var paragraphStyle = NSMutableParagraphStyle()
    40. var font = UIFont(name: "Helvetica Bold", size: 20.0)
    41. var text = ""
    42. let attributes = [
    43. NSAttributedString.Key.paragraphStyle: paragraphStyle,
    44. NSAttributedString.Key.font: font!,
    45. NSAttributedString.Key.foregroundColor: UIColor.black
    46. ]
    47. var attributedString = NSAttributedString(string: text, attributes: attributes)
    48. // ÜBERSCHRIFT
    49. font = UIFont(name: "Helvetica Bold", size: 20.0)
    50. text = "Tagesbedarf in % vom " + heuteString
    51. paragraphStyle.alignment = .left
    52. var stringReckteck = CGRect(x: 50, y: 50, width: 300, height: 40)
    53. attributedString.draw(in: stringReckteck)
    54. // Vitalstoffwerte Liste
    55. y = 80
    56. for zeile in 0..<vitalstoffWerteListe.count {
    57. let druckenVitalstoffWerte = vitalstoffWerteListe[zeile]
    58. if druckenVitalstoffWerte.zeilenInfoID == 0 { // Überschrift
    59. y = y + 10
    60. font = UIFont(name: "Helvetica Bold", size: 14.0)
    61. text = druckenVitalstoffWerte.name
    62. attributedString.draw(in: stringReckteckX50)
    63. } else { // Detail
    64. font = UIFont(name: "Helvetica", size: 12.0)
    65. text = druckenVitalstoffWerte.name
    66. attributedString.draw(in: stringReckteckX50)
    67. text = druckenVitalstoffWerte.anzahl
    68. paragraphStyle.alignment = .right
    69. attributedString.draw(in: stringReckteckX160)
    70. paragraphStyle.alignment = .left
    71. text = druckenVitalstoffWerte.masse
    72. attributedString.draw(in: stringReckteckX170)
    73. }
    74. y = y + 30
    75. }
    76. y = 80
    77. text = "Lebensmittel"
    78. font = UIFont(name: "Helvetica Bold", size: 14.0)
    79. paragraphStyle.alignment = .left
    80. attributedString.draw(in: stringReckteckX220)
    81. // Vitalstoffwerte Liste
    82. y = 120
    83. for zeile in 0..<vitalstoffWerteListe.count {
    84. let anzahlZeilen = vitalstoffWerteListe[zeile]
    85. font = UIFont(name: "Helvetica", size: 12.0)
    86. text = anzahlZeilen.name
    87. attributedString.draw(in: stringReckteckX220)
    88. text = anzahlZeilen.anzahl
    89. paragraphStyle.alignment = .right
    90. attributedString.draw(in: stringReckteckX330)
    91. paragraphStyle.alignment = .left
    92. text = anzahlZeilen.masse
    93. attributedString.draw(in: stringReckteckX340)
    94. }
    95. y = y + 30
    96. return attributedString
    97. }
    98. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Lukas Hedinger () aus folgendem Grund: weitere Frage

  • Aus Deinem anderen Post entnehme ich, dass sich diese Frage(n) inzwischen geklärt haben? Falls nicht, hier die Kurzform:
    1. Nein, Du brauchst nicht zwingend einen PageFormatter oder UIPrintPageRenderer, wenn Du das PDF nur in einer Datei speichern willst
    2. Zum Dateinamen habe ich in dem anderen Thread etwas geschrieben
    3. Deinen Inhalt musst Du innerhalb des PDF-Contextes zeichnen (wie Du es ja auch machst).
    4. Ich würde auch immer den Zeichen-Code in eine eigenen Prozedur auslagern, um ihn z. B. für das Erstellen einer Grafik oder zum Drucken wiederverwenden zu können. Eine Rückgabewert brauchst Du hier nicht, wenn sich diese Prozedur den aktuellen Context zum Zeichnen holt.
    In einer meiner Apps sieht es z. B. so aus (Achtung, Objective-C und MRC):

    Quellcode

    1. - (NSData *)weekPDF
    2. {
    3. NSData *returnData;
    4. NSMutableData *pdfData = [[NSMutableData alloc] init];
    5. CGRect pageRect = CGRectMake(0.0f, 0.0f, 595.28f, 841.89f); // DIN A4 page size
    6. UIGraphicsBeginPDFContextToData(pdfData, pageRect, nil);
    7. UIGraphicsBeginPDFPage();
    8. {
    9. [self drawWeekInRect:pageRect inColor:YES];
    10. }
    11. UIGraphicsEndPDFContext();
    12. returnData = [NSData dataWithData:pdfData];
    13. return returnData;
    14. }
    Alles anzeigen

    Das Zeichnen erfolgt dann im aktuellen Context in einer anderen Methode:

    Quellcode

    1. - (void)drawWeekInRect:(CGRect)rect inColor:(BOOL)color
    2. {
    3. CGContextRef context = UIGraphicsGetCurrentContext();
    4. CGContextSaveGState(context);
    5. ...
    6. CGContextRestoreGState(context);
    7. }
    Das NSData-Objekt kannst Du dann einfach als PDF-Datei speichern, als Attachment verwenden oder ähnliches. Brauchst Du eine Grafik Deiner View, nutzt Du einfach einen Graphics-Context, oder zum Drucken erstellst Du einen UIPrintPageRenderer, der in seiner "drawContentForPageAtIndex..."-Methode wieder Deine Zeichenroutine aufruft.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • ok das heisst wenn ich zwischen
    1. UIGraphicsBeginPDFPage();
    2. UIGraphicsEndPDFContext();
    meine draw Methode rein setzte, dann wird alles was ich .draw mache als teil des PDF verstanden. Ich dachte mir schon so was ähnliches, aber gut, dass ich es jetzt sicher weiss. Dann müsste all das ok sein und in der PDF Datei etwas drin sein. Mein neuste Problem schreibe ich in das andere Thema

    Danke vielmals
  • Ich habe gemerkt, dass mein PDF File leer ist :(

    Was mache ich falsch?

    Quellcode ist natürlich Swift nicht C





    C-Quellcode

    1. let html = "<html><head><meta charset='UTF-8'></head><body>Erstelle Vitalstoffwerte PDF</body></html"
    2. let formatter = UIMarkupTextPrintFormatter(markupText: html)
    3. let render = UIPrintPageRenderer()
    4. render.addPrintFormatter(formatter, startingAtPageAt: 0)
    5. let pageRect = CGRect(x: 0, y: 0, width: 595.28, height: 841.89) // A4, 72 dpi
    6. let printable = pageRect.insetBy(dx: 0, dy: 0)
    7. render.setValue(NSValue(cgRect: pageRect), forKey: "paperRect")
    8. render.setValue(NSValue(cgRect: printable), forKey: "printableRect")
    9. let pdfData = NSMutableData()
    10. UIGraphicsBeginPDFContextToData(pdfData, pageRect, nil)
    11. UIGraphicsBeginPDFPage()
    12. for i in 1...render.numberOfPages {
    13. UIGraphicsBeginPDFPage();
    14. let bounds = UIGraphicsGetPDFContextBounds()
    15. render.drawPage(at: i - 1, in: bounds)
    16. drawWeekInRect()
    17. }
    18. UIGraphicsEndPDFContext()
    19. let dateiName = "Vitalstoffwerte " + heuteString
    20. let fileUrl = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(dateiName).pdf")
    21. do {
    22. try pdfData.write(to: fileUrl, options: .atomic)
    23. } catch {
    24. print(error,"erstellen des PDF Dokumentes fehlgeschlagen")
    25. }
    26. let webview = WKWebView(frame: UIScreen.main.bounds)
    27. view.addSubview(webview)
    28. webview.load(URLRequest(url: fileUrl))
    29. //webview.navigationDelegate = self // Braucht es nicht oder?
    Alles anzeigen




    C-Quellcode

    1. func drawWeekInRect()
    2. {
    3. var context : CGContext = UIGraphicsGetCurrentContext()!;
    4. context.saveGState()
    5. var paragraphStyle = NSMutableParagraphStyle()
    6. var font = UIFont(name: "Helvetica Bold", size: 20.0)
    7. var text = ""
    8. let attributes = [
    9. NSAttributedString.Key.paragraphStyle: paragraphStyle,
    10. NSAttributedString.Key.font: font,
    11. NSAttributedString.Key.foregroundColor: UIColor.black
    12. ]
    13. var attributedString = NSAttributedString(string: text, attributes: attributes)
    14. // ÜBERSCHRIFT
    15. font = UIFont(name: "Helvetica Bold", size: 20.0)
    16. text = "Tagesbedarf in % vom " + heuteString
    17. paragraphStyle.alignment = .left
    18. var stringRechteck = CGRect(x: 50, y: 50, width: 300, height: 40)
    19. attributedString.draw(in: stringRechteck)
    20. context.restoreGState()
    21. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von Lukas Hedinger ()

  • Wenn etwas nicht wie gewünscht funktioniert, dann bietet es sich manchmal an ein Product > Analyze zu machen. Ich tippe mal, dass dies für Swift genauso gut funktioniert wie für Objective-C.

    Der Analyzer sollte Dir für den o.a. Code dann eine Warning vom Typ Dead store für die Zeile

    Quellcode

    1. text = "Tagesbedarf in % vom " + heuteString
    anzeigen, da text zwar ein Wert zugewiesen wird, text danach jedoch nicht weiter verwendet wird. Laut Analyzer kann man sich diese Zuweisung somit also auch sparen.

    In diesem Fall solltest Du dann stutzig werden, warum dies so ist und erkennen, dass die Zeile zu weit unten steht. ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MCDan ()

  • Danke.

    Wie lässt man den Analyzer laufen? Ich glaube bei Swift sind das die gelben Markierungen, bei denen sagt er solche Eine normalerweise schon

    Ich denke, das Problem war, dass Text oben mit "" definiert war und deshalb schon immer einen Wert hatte.

    Egal, jetzt geht es ja und so ist es halt das programmieren. Ohne eigene Fehler und wenn es zu allem ausführliche Bücher gäbe, wäre es viel einfacher und schneller. Zudem bin ich erst seit einigen Monaten dabei.
  • Pdf Erstellung, Vorschau und Speicherung durch User ist geschafft. Hier mein SWIFT CODE. Vielleicht hilft es jemand anderem irgendwann.

    C-Quellcode

    1. func SavePdfUser(){
    2. // Create page rect
    3. let pageRect = CGRect(x: 0, y: 0, width: 595.28, height: 841.89) // A4, 72 dpi
    4. // Create PDF context and draw
    5. let pdfData = NSMutableData()
    6. UIGraphicsBeginPDFContextToData(pdfData, pageRect, nil)
    7. UIGraphicsBeginPDFPage()
    8. // From here you can draw page, best make it in a function
    9. PdfErstellung.PdfErstellen(auswahlZeilen, vitalstoffWerteListe, heuteString)
    10. UIGraphicsEndPDFContext()
    11. // Save pdf DATA through user
    12. let activityViewController = UIActivityViewController(activityItems: [pdfData], applicationActivities: nil)
    13. activityViewController.popoverPresentationController?.sourceView = self.view // für IPAD nötig
    14. self.present(activityViewController, animated: true, completion: nil)
    15. // save temporary for preview
    16. let dateiName = "Vitalstoffwerte " + heuteString
    17. let fileUrl = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(dateiName).pdf")
    18. do {
    19. try pdfData.write(to: fileUrl, options: .atomic)
    20. } catch {
    21. print(error,"file not save")
    22. }
    23. // Preview
    24. let webview = WKWebView(frame: UIScreen.main.bounds)
    25. view.addSubview(webview)
    26. webview.load(URLRequest(url: fileUrl))
    27. }
    Alles anzeigen

    C-Quellcode

    1. //
    2. // PdfErstellen.swift
    3. // Vitalstoffcontroller
    4. //
    5. // Created by Lukas Hedinger on 20.09.18.
    6. // Copyright © 2018 Afac AG. All rights reserved.
    7. //
    8. import UIKit
    9. import Foundation
    10. class PdfErstellung {
    11. static func PdfErstellen(_ auswahlZeilen : [LebensmittelDataTV], _ vitalstoffWerteListe : [LebensmittelDataTV], _ heuteString : String) {
    12. var y = 0 // Points from above - von oben
    13. var x = 0 // Points form left - von links
    14. var width = 0 // length of rect - länge vom rechteck
    15. var height = 0 // height of rect - höhe vom rechteck
    16. var stringRechteck = CGRect(x: x, y: y, width: width, height: height) // make rect for text - rechteck für Text
    17. var paragraphStyle = NSMutableParagraphStyle() // text alignment - text ausrichtung
    18. var font = UIFont(name: "HelveticaNeue-Bold", size: 10.0) // Important: the font name must be written correct - Wichtig: Textname muss korrekt geschrieben werden
    19. var text = ""
    20. let attributes = [
    21. NSAttributedString.Key.paragraphStyle: paragraphStyle,
    22. NSAttributedString.Key.font: font,
    23. NSAttributedString.Key.foregroundColor: UIColor.black
    24. ]
    25. // Title - ÜBERSCHRIFT
    26. font = UIFont(name: "HelveticaNeue-Bold", size: 20.0)
    27. text = "Tagesbedarf in % vom " + heuteString // heuteString = date/datum
    28. paragraphStyle.alignment = .left
    29. x = 50; y = 30; width = 300; height = 40
    30. stringRechteck = CGRect(x: x, y: y, width: width, height: height)
    31. text.draw(in: stringRechteck, withAttributes: attributes)
    32. // List - Vitalstoffwerte Liste
    33. y = 45
    34. for zeile in 0..<vitalstoffWerteListe.count {
    35. let druckenVitalstoffWerte = vitalstoffWerteListe[zeile]
    36. if druckenVitalstoffWerte.zeilenInfoID == 0 { // Title - Überschrift
    37. y = y + 5 // distance to above becaus is title - Abstand nach oben, weil Überschrift
    38. x = 50; width = 80; height = 20
    39. stringRechteck = CGRect(x: x, y: y, width: width, height: height)
    40. font = UIFont(name: "HelveticaNeue-Bold", size: 10.0) // change font - verändere schrift
    41. text = druckenVitalstoffWerte.name
    42. text.draw(in: stringRechteck, withAttributes: attributes)
    43. font = UIFont(name: "HelveticaNeue", size: 8.0) // change font back - schrift zurück ändern
    44. } else { // or detail
    45. x = 50; width = 90; height = 20
    46. stringRechteck = CGRect(x: x, y: y, width: width, height: height)
    47. text = druckenVitalstoffWerte.name
    48. text.draw(in: stringRechteck, withAttributes: attributes)
    49. x = 150; width = 40
    50. stringRechteck = CGRect(x: x, y: y, width: width, height: height)
    51. text = druckenVitalstoffWerte.anzahl
    52. paragraphStyle.alignment = .right
    53. text.draw(in: stringRechteck, withAttributes: attributes)
    54. paragraphStyle.alignment = .left
    55. x = 195; width = 20
    56. stringRechteck = CGRect(x: x, y: y, width: width, height: height)
    57. text = druckenVitalstoffWerte.masse
    58. text.draw(in: stringRechteck, withAttributes: attributes)
    59. }
    60. y = y + 10 // 10 down for next line - 10 nach unten für nächste Zeile
    61. }
    62. // Title - Überschrift
    63. x = 220; y = 50; width = 100; height = 20
    64. text = "Lebensmittel"
    65. font = UIFont(name: "HelveticaNeue-Bold", size: 8.0)
    66. paragraphStyle.alignment = .left
    67. stringRechteck = CGRect(x: x, y: y, width: width, height: height)
    68. text.draw(in: stringRechteck, withAttributes: attributes)
    69. font = UIFont(name: "HelveticaNeue", size: 8.0)
    70. // List - Lebensmittelliste
    71. y = 60
    72. for zeile in 0..<auswahlZeilen.count {
    73. let auswahlZeilenObjekt = auswahlZeilen[zeile]
    74. x = 220; width = 90; height = 20
    75. stringRechteck = CGRect(x: x, y: y, width: width, height: height)
    76. text = auswahlZeilenObjekt.name
    77. text.draw(in: stringRechteck, withAttributes: attributes)
    78. x = 320; width = 40
    79. stringRechteck = CGRect(x: x, y: y, width: width, height: height)
    80. text = auswahlZeilenObjekt.anzahl
    81. paragraphStyle.alignment = .right
    82. text.draw(in: stringRechteck, withAttributes: attributes)
    83. paragraphStyle.alignment = .left
    84. x = 365; width = 20
    85. stringRechteck = CGRect(x: x, y: y, width: width, height: height)
    86. text = auswahlZeilenObjekt.masse
    87. text.draw(in: stringRechteck, withAttributes: attributes)
    88. y = y + 10
    89. if zeile == 75 { // 76 items - Zeilen
    90. break
    91. }
    92. }
    93. y = 60
    94. if auswahlZeilen.count > 75 {
    95. for zeile in 76..<auswahlZeilen.count {
    96. let auswahlZeilenObjekt = auswahlZeilen[zeile]
    97. x = 390; width = 90; height = 20
    98. stringRechteck = CGRect(x: x, y: y, width: width, height: height)
    99. text = auswahlZeilenObjekt.name
    100. text.draw(in: stringRechteck, withAttributes: attributes)
    101. x = 490; width = 40
    102. stringRechteck = CGRect(x: x, y: y, width: width, height: height)
    103. text = auswahlZeilenObjekt.anzahl
    104. paragraphStyle.alignment = .right
    105. text.draw(in: stringRechteck, withAttributes: attributes)
    106. paragraphStyle.alignment = .left
    107. x = 535; width = 20
    108. stringRechteck = CGRect(x: x, y: y, width: width, height: height)
    109. text = auswahlZeilenObjekt.masse
    110. text.draw(in: stringRechteck, withAttributes: attributes)
    111. y = y + 10
    112. if zeile == 151 { // 76 items - Zeilen
    113. break
    114. }
    115. }
    116. }
    117. }
    118. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von Lukas Hedinger () aus folgendem Grund: ein if vergessen

  • Eine Frage hätte ich noch, wenn ich die PdfData an ViewController übergebe, kann ich da den Dateinamen ändern, so dass er nicht "PDF Document.pdf heisst, sondern so wie ich es möchte?

    Und wenn ich schon am fragen bin: Kann ich meine App als IOS12 App machen in XCODE und sie läuft trotzdem auch in älteren IOS Versionen, oder muss ich die App als IOS 9.0 App machen, wenn sie von IOS 9 bis 12 gehen soll?
  • Lukas Hedinger schrieb:

    Eine Frage hätte ich noch, wenn ich die PdfData an ViewController übergebe, kann ich da den Dateinamen ändern, so dass er nicht "PDF Document.pdf heisst, sondern so wie ich es möchte?

    Du zeigst das PDF in einem WKWebView an, richtig? Da hätte ich vermutet, dass beim Speichern der Name des PDFs und nicht "PDF Document.pdf" verwendet wird.

    Vielleicht versuchst Du es mal mit dem UIActivityViewController anstelle des WKWebViews. Wenn Du dann nicht direkt das PDF, sondern eine Klasse mit UIActivityItemSource Protokol übergibst, kannst Du evtl. über activityViewController(_:subjectForActivityType:) den Namen der PDF Datei beeinflussen.

    Lukas Hedinger schrieb:


    Und wenn ich schon am fragen bin: Kann ich meine App als IOS12 App machen in XCODE und sie läuft trotzdem auch in älteren IOS Versionen, oder muss ich die App als IOS 9.0 App machen, wenn sie von IOS 9 bis 12 gehen soll?
    Die iOS Version, ab welcher sich die App verwenden lässt, kannst Du über Deployment Target im General Tab des Targets einstellen. Du solltest natürlich darauf achten, dass Du keine iOS Methode etc. verwendest, die erst ab einer späteren iOS Version zur Verfügung stehen. Dies würde dann zu einem Absturz zur Laufzeit führen, sobald diese Methode etc. verwendet wird.
  • Dazu noch eine Frage. Kann ich diesem Controller auch meine PDFData übergeben? Mit der FileURL hatte ich es früher schon mal ausprobiert und hatte das gleiche Problem, wie mit dem UIActivityViewController. Ich habe auch gemerkt, dass PDFData für meine Zwecke besser ist als eine Datei, da die Daten auch gleich gedruckt werden können oder zu einem PDF gemacht und beide Möglichkeiten dem Benutzer gleich zeigen, wie es aussehen wird, ist dann so wie bei Android, ausser der Dateiname. Im schlimmsten Fall kann ich damit leben.
  • Der Fehler gibt es nur bei IOS 12. Gibt es eine Möglichkeit so einen Fehler abzufangen und drauf zu reagieren? Dann könnte ich zuerst versuchen ein File abzufragen und so mein Dateinamen weiterzugeben und wenn das nicht funktioniert, dann gebe ich eben die pdf Daten weiter.

    C-Quellcode

    1. do {
    2. let dateiName = "Vitalstoffwerte " + heuteString
    3. let fileUrl = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(dateiName).pdf")
    4. do {
    5. try pdfData.write(to: fileUrl, options: .atomic)
    6. } catch {
    7. print(error,"file not save")
    8. }
    9. let activityViewController = UIActivityViewController(activityItems: [fileUrl], applicationActivities: nil)
    10. activityViewController.popoverPresentationController?.sourceView = self.view // für IPAD nötig
    11. self.present(activityViewController, animated: true, completion: nil)
    12. } catch {
    13. let activityViewController = UIActivityViewController(activityItems: [pdfData], applicationActivities: nil)
    14. activityViewController.popoverPresentationController?.sourceView = self.view // für IPAD nötig
    15. self.present(activityViewController, animated: true, completion: nil)
    16. }
    Alles anzeigen
    Ich weiss, das do, catch funktioniert so nicht, aber kann ich den unten stehenden error irgendwie abfragen im Code und darauf reagieren, wenn er auftritt?

    2018-09-25 15:36:55.787894+0200 Vitalstoffcontroller[8656:186334] [default] [ERROR] Failed to determine whether URL /Users/lukashedinger/Library/Developer/CoreSimulator/Devices/45A185C5-6DEA-4A52-B415-939758FB7F7E/data/Containers/Data/Application/2469BE4A-53B2-4545-B5D7-E64FBCDB383E/tmp/Vitalstoffwerte 25092018-25092018.pdf (n) is managed by a file provider 2018-09-25 15:36:56.312499+0200 Vitalstoffcontroller[8656:186334] [ShareSheet] cancelled request - error: The operation couldn’t be completed. Invalid argument

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Lukas Hedinger ()