как сделать массив включать PDF-документ - PullRequest
1 голос
/ 26 марта 2019

Я новичок в Swift и пытаюсь понять, как кодировать мой массив, чтобы включить PDF-документ. Я настроил tableView, так как при нажатии на ячейку будет перемещен в новый контроллер представления детали. Я хочу, чтобы новый детальный контроллер отображал PDF, связанный с выбранной ячейкой. Есть ли разумный способ закодировать это?

Я пытался закодировать эту часть.

import Foundation
import UIKit
import PDFKit

class State
{
    var title: String
    var detailText: String
    var description: String
    var image: UIImage

    var document: PDFDocument

    init(titled: String, detailText: String, imageName: String, description: String, document: String)
    {
        self.title = titled
        self.detailText = detailText
        self.description = description

        self.document = PDFDocument

        if let img = UIImage(named: imageName){
            image = img
        } else {
            image = UIImage(named: "default")!
        }
    }
}

Я пытаюсь заставить код распознавать «документ» как PDFDocument, но получаю ошибку: не удается присвоить значение типа «PDFDocument.Type» типу «PDFDocument», где я ошибаюсь?

1 Ответ

1 голос
/ 26 марта 2019

Причина ошибки заключается в том, что вы пытаетесь присвоить тип (PDFDocument) для self.document вместо параметра, который был передан в init - document. Также тип параметра должен быть PDFDocument, а не String.

import Foundation
import UIKit
import PDFKit

class State
{
    var title: String
    var detailText: String
    var description: String
    var image: UIImage

    var document: PDFDocument

    init(titled: String, detailText: String, imageName: String, description: String, document: PDFDocument)
    {
        self.title = titled
        self.detailText = detailText
        self.description = description

        self.document = document

        if let img = UIImage(named: imageName){
            image = img
        } else {
            image = UIImage(named: "default")!
        }
    }
}

Если вам не нужно State, чтобы быть классом по какой-то другой причине, я бы предложил сделать его структурой - это дает неявную неизменность. Вы также можете упростить этот оператор if, используя оператор объединения nil

import Foundation
import UIKit
import PDFKit

struct State
{
    var title: String
    var detailText: String
    var description: String
    var image: UIImage
    var document: PDFDocument

    init(titled: String, detailText: String, imageName: String, description: String, document: PDFDocument)
    {
        self.title = titled
        self.detailText = detailText
        self.description = description

        self.document = document
        self.image = UIImage(named: imageName) ?? UIImage(named: "default")!
    }
}

Хорошо,

Похоже, что ваш реальный вопрос: "Как мне получить PDFDocument из моего пакета приложений?".

Вы можете использовать что-то вроде этого:

if let path = Bundle.main.path(forResource: "SomePdfFile", ofType: "pdf") {
      do {
          let fileUrl = URL(fileURLWithPath: path)
          if let pdfDocument = PDFDocument(url:fileURL) {
              // Do something with PDFDocument
          }
      } catch {
          print("There was an error - \(error)")
      }
}

Вы можете превратить это в функцию:

func loadPDF(named: String) throws -> PDFDocument? {
    guard let path = Bundle.main.path(forResource: "SomePdfFile", ofType: "pdf") else {
        return nil
   }

   let fileUrl = URL(fileURLWithPath: path)
   return PDFDocument(url:fileURL)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...