在UIViewControllerRepresentable中传递数据

时间:2019-10-12 07:46:57

标签: xcode swiftui pdfkit

我正在尝试使用UIKit制作PDFView,并从先前的SwiftUI视图传递数据。数据本身是带有文件名的字符串。不知何故,该字符串没有从UIViewControllerRepresentable传递到UIViewController,并且保持为空。我真的找不到发生这种情况的原因。你能检查我哪里错了吗?我希望这段代码足够。

我正在使用NavigationLink(目标:FileViewerWrapper(文件:“某些字符串”)){}

import PDFKit
import UIKit
import SwiftUI

let pdfView = PDFView()

class FileViewer: UIViewController {

var file = String()


override func viewDidLoad() {
    super.viewDidLoad()

    print("\n\n\n-----------------------\(file)\n-------------------------------\n\n\n")

    pdfView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(pdfView)

    pdfView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
    pdfView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
    pdfView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
    pdfView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true

    guard let path = Bundle.main.url(forResource: file, withExtension: "pdf", subdirectory: "Files") else { return }

    if let document = PDFDocument(url: path) {
        pdfView.document = document
    }
}
}


struct FileViewerWrapper: UIViewControllerRepresentable {

var file: String

typealias UIViewControllerType = FileViewer


   func makeUIViewController(context: UIViewControllerRepresentableContext<FileViewerWrapper>) -> FileViewerWrapper.UIViewControllerType {
       return FileViewer()
   }

   func updateUIViewController(_ uiViewController: FileViewerWrapper.UIViewControllerType, context: UIViewControllerRepresentableContext<FileViewerWrapper>) {

    uiViewController.file = file
   //When I put print(file) here, it's fine

   }
}

的结果是:    // ------------------------    // -------------------------------

应为:    // ------------------------    串    // -------------------------------

2 个答案:

答案 0 :(得分:0)

我想我已经钉牢了:

func makeUIViewController(context: UIViewControllerRepresentableContext<FileViewerWrapper>) -> FileViewerWrapper.UIViewControllerType {
    let uiViewController = FileViewer()
    uiViewController.file = file

       return uiViewController
   }

func updateUIViewController现在为空

答案 1 :(得分:0)

当您只想传递时,请使用单独的UIViewControllerRepresentable,它将具有您的UIViewController,然后将数据从View传递到ViewController。

struct CameraViewControllerRepresentable : UIViewControllerRepresentable {
    typealias UIViewControllerType = CameraViewController
    var patientObject: PatientObj

    public func makeUIViewController(context: UIViewControllerRepresentableContext<CameraViewControllerRepresentable>) -> CameraViewController {
        let cameraVC = UIStoryboard(name: "Camera", bundle: nil).instantiateViewController(identifier: String(describing: CameraViewController.self)) as! CameraViewController
        cameraVC.patientObj = patientObject
        return cameraVC


       }

    func updateUIViewController(_ uiViewController: CameraViewController, context: UIViewControllerRepresentableContext<CameraViewControllerRepresentable>) {

    }

}