我试图将数据模型从初始视图控制器传递到现在显示在屏幕上的视图控制器。我有一个显示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的体验有所不同。
答案 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)
}