Передача данных из UIViewControllerRepresentable в UIViewController - PullRequest
1 голос
/ 17 марта 2020

Я пытаюсь передать данные из структуры SwiftUI (имя и фамилия) и не могу обновить переменные в моем UIViewController с данными в моем UIViewControllerRepresentable.

Я проверил и подтвердил, что данные, которые я пытаюсь передать из моего представления SwiftUI, верны. Что мне нужно сделать / изменить, чтобы обновить переменные firstName и lastName в моем UIViewController?

import UIKit
import PDFKit
import SwiftUI

class PDFPreviewViewController: UIViewController {
    public var documentData: Data?

    var firstName: String = "firstName did not load"
    var lastName: String = "lastName did not load"

    @IBOutlet weak var pdfView: PDFView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let pdfCreator = PDFCreator(firstName: firstName, lastName: lastName, format: "test format")
        documentData = pdfCreator.createReleasePDF()
        if let data = documentData {
            pdfView.document = PDFDocument(data: data)
            pdfView.autoScales = true
        }
    }
}

struct PDFPreviewController: UIViewControllerRepresentable {
    var release: ModelRelease
    let vc = PDFPreviewViewController()

    func makeUIViewController(context: UIViewControllerRepresentableContext<PDFPreviewController>) -> UIViewController {

        let storyboard = UIStoryboard(name: "Preview", bundle: Bundle.main)
        let controller = storyboard.instantiateViewController(identifier: "Preview")

        vc.firstName = release.firstName
        vc.lastName = release.lastName

        return controller
    }

    func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<PDFPreviewController>) {
    }
}

struct PDFPreviewControllerWrapper: View {
    @Environment(\.presentationMode) var presentationMode

    var release: ModelRelease

    var body: some View {
        NavigationView {
            PDFPreviewController(release: release)
            .navigationBarTitle(Text("Preview"))
            .navigationBarItems(trailing: Button(action: {
                self.presentationMode.wrappedValue.dismiss()
            }) {
                Text("Done")
                    .fontWeight(.bold)
                }
            )
        }
    }
}

1 Ответ

1 голос
/ 18 марта 2020

Создавая представление контроллера, вы устанавливаете параметры для одного контроллера, но возвращаете другой. Возможно, вы имели в виду следующее:

//let vc = PDFPreviewViewController() // don't think it is needed at all

func makeUIViewController(context: UIViewControllerRepresentableContext<PDFPreviewController>) -> UIViewController {

    let storyboard = UIStoryboard(name: "Preview", bundle: Bundle.main)
    let controller = storyboard.instantiateViewController(identifier: 
                         "Preview") as! PDFPreviewViewController

    controller.firstName = release.firstName // << here !
    controller.lastName = release.lastName   // << and here !

    return controller
}
...