Переданная модель данных выходит как ноль, хотя в отладке я был задан var get перед передачей - PullRequest
2 голосов
/ 22 апреля 2019

Я пытаюсь передать модель данных из моего начального контроллера представления в контроллер представления, который теперь находится на экране. У меня есть контейнер, который показывает PDF. Когда я запускаю код, документ, который передается в контейнер, по какой-то причине равен нулю.

Я использовал отладчик и смотрю, как он настроен в контроллере начального представления, но когда загружается следующая раскадровка, эта переменная по какой-то причине теперь равна нулю. Я попробовал это в 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 Ответ

1 голос
/ 22 апреля 2019

Вы можете решить эту проблему с помощью некоторого защитного программирования и наблюдателя свойств:

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...