即使在调试中我是在传递之前设置变量var,传递的数据模型也会显示为nil

时间:2019-04-22 20:12:00

标签: ios swift uiviewcontroller

我试图将数据模型从初始视图控制器传递到现在显示在屏幕上的视图控制器。我有一个显示pdf的容器视图。当我运行代码时,由于某种原因传递到容器中的文档为零。

我已经使用了调试器,并在初始视图控制器中看到了它的设置,但是当加载下一个故事板时,由于某种原因,var现在为零。我已经在viewDidAppear中尝试过,但是遇到了同样的问题。

我的初始视图控制器(主页)

let documentGet = Data.documentModel[selectedRow - 1]
            let storyboard = UIStoryboard(name: String(describing: NoteTakingViewController.self), bundle: nil)
            let vc = storyboard.instantiateInitialViewController() as! NoteTakingViewController
            vc.documentSet = documentGet

            //self.navigationController?.pushViewController(vc, animated: true)
            //self.present(vc, animated: true, completion: nil)
            self.show(vc, sender: selectedRow)

我通过上一个vc.documentSet = documentGet

的情节提要的下一个视图控制器
    let pdfViewer = PDFView()
    @IBOutlet weak var PDFClass: PDFViewClass!
    var documentSet:DocumentModel!


    override func viewDidLoad() {
        super.viewDidLoad()
        PDFClass.setDocument(document: self.documentSet) <----(this is where the error occurs)
        self.title = documentSet.title
        navigationController?.navigationBar.prefersLargeTitles = false
    }

这是容器视图的视图控制器。这是一个自定义类,因为我试图使它在以前的控制器上运行,但是它将阻塞我试图在导航栏下方找到的工具栏(是的,直接在导航栏下方)

    private func configurePDF() {
        pdfViewer.translatesAutoresizingMaskIntoConstraints = true
        view.addSubview(pdfViewer)
    }

    func setDocument(document: DocumentModel!) {
        configurePDF()
        let doc = PDFDocument(url: document.url)
        pdfViewer.document = doc
    }

我希望pdf数据来自首页->视图控制器->容器视图控制器。但是我对视图控制器一无所知。我想我只是不明白如何UIView加载。我的想法是将视图控制器中的变量设置为vc.documentSet = documentGet,然后在该视图启动时将变量传递到容器视图。

我希望这不是一个超级简单的事情,但是swift的工作方式与我对Java的体验有所不同。

1 个答案:

答案 0 :(得分:1)

您可以通过一些防御性编程和一个属性观察器来解决此问题:

let pdfViewer = PDFView()
@IBOutlet weak var PDFClass: PDFViewClass!
var documentSet: DocumentModel? {
  didSet {
        self.title = documentSet?.title
        if documentSet != oldValue {
            setDocument(to: documentSet)
        }
     }
 }

override func viewDidLoad() {
    super.viewDidLoad()
    setDocument(to: documentSet)
    navigationController?.navigationBar.prefersLargeTitles = false
}

private func setDocument(to document: DocumentModel?) {
    guard let validDocument = document else { return }
    PDFClass?.setDocument(document: validDocument)
}