SwiftUI从UIKit向SwiftUI获取数据

SwiftUI从UIKit向SwiftUI获取数据,swiftui,Swiftui,我正在我的应用程序中构建一个条形码阅读器,到目前为止,我可以获得该值,但无法将数据传递到我的SwiftUI应用程序。应用程序的阅读器部分使用UIKit,我使用firebase ml条形码阅读器。我似乎找不到任何方法来获取SwiftUI部分的卡号。我还想在条形码解码后关闭视图。谢谢你的帮助 这是我的条形码阅读器的文件: import SwiftUI import UIKit import AVFoundation import Firebase struct BarcodeView: View

我正在我的应用程序中构建一个条形码阅读器,到目前为止,我可以获得该值,但无法将数据传递到我的SwiftUI应用程序。应用程序的阅读器部分使用UIKit,我使用firebase ml条形码阅读器。我似乎找不到任何方法来获取SwiftUI部分的卡号。我还想在条形码解码后关闭视图。谢谢你的帮助

这是我的条形码阅读器的文件:

import SwiftUI
import UIKit
import AVFoundation
import Firebase

struct BarcodeView: View {
    
    @State var isShowingCameraView = false
    
    var body: some View {
        CameraView()
            .edgesIgnoringSafeArea(.all)
        Text("Here I want to have the barcode number")

    }
}

struct BarcodeView_Previews: PreviewProvider {
    static var previews: some View {
        BarcodeView()
    }
}

//UIKit

struct CameraView : UIViewControllerRepresentable {
    
    let myBarcode: Int = 0
    
    
    
    func makeUIViewController(context: UIViewControllerRepresentableContext<CameraView>) -> UIViewController {
        let controller = BarCodeDetectorViewController()
        return controller
    }
    
    func updateUIViewController(_ uiViewController: CameraView.UIViewControllerType, context: UIViewControllerRepresentableContext<CameraView>) {}
}

class BarCodeDetectorViewController : UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {

    let session = AVCaptureSession()
    lazy var vision = Vision.vision()
    var barcodeDetector :VisionBarcodeDetector?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        startLiveVideo()
        self.barcodeDetector = vision.barcodeDetector()
    }
    
    func startLiveVideo() {
        
        session.sessionPreset = AVCaptureSession.Preset.photo
        let captureDevice = AVCaptureDevice.default(for: AVMediaType.video)
                
        let deviceInput = try! AVCaptureDeviceInput(device: captureDevice!)
        let deviceOutput = AVCaptureVideoDataOutput()
        deviceOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey as String: Int(kCVPixelFormatType_32BGRA)]
        deviceOutput.setSampleBufferDelegate(self, queue: DispatchQueue.global(qos: DispatchQoS.QoSClass.default))
        session.addInput(deviceInput)
        session.addOutput(deviceOutput)

        let cameraPreview = AVCaptureVideoPreviewLayer(session: session)
                        
        view.layer.addSublayer(cameraPreview)
        cameraPreview.frame = view.frame

        session.startRunning()
    }
    
    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
            
            if let barcodeDetector = self.barcodeDetector {
                
                let visionImage = VisionImage(buffer: sampleBuffer)
                
                barcodeDetector.detect(in: visionImage) { (barcodes, error) in
                    
                    if let error = error {
                        print(error.localizedDescription)
                        return
                    }
                    
                    for barcode in barcodes! {
                        print(barcode.rawValue!) //here is the card number
                    }
                }
            }
        }    
}
导入快捷界面
导入UIKit
进口AVF基金会
进口火基
结构条码视图:视图{
@状态变量isShowingCameraView=false
var body:一些观点{
喀麦隆人()
.edgesIgnoringSafeArea(.all)
文本(“这里我想要条形码号码”)
}
}
结构条形码视图\u预览:预览提供程序{
静态var预览:一些视图{
条形码视图()
}
}
//UIKit
结构CameraView:UIViewControllerRepresentable{
让myBarcode:Int=0
func makeUIViewController(上下文:UIViewControllerRepresentableContext)->UIViewController{
let controller=BarCodeDetectorViewController()
返回控制器
}
func updateUIViewController(uUIViewController:CameraView.UIViewControllerType,上下文:UIViewControllerRepresentableContext){}
}
类BarCodeDetectorViewController:UIViewController、AVCaptureVideoDataOutputSampleBufferDelegate{
let session=AVCaptureSession()
lazy-var-vision=vision.vision()
var条码检测器:VisionBarcodeDetector?
重写func viewDidLoad(){
super.viewDidLoad()
令人吃惊的视频
self.barcode检测器=vision.barcode检测器()
}
func视频(){
session.sessionPreset=AVCaptureSession.Preset.photo
让captureDevice=AVCaptureDevice.default(对于:AVMediaType.video)
让deviceInput=try!AVCaptureDeviceInput(设备:captureDevice!)
让deviceOutput=AVCaptureVideoDataOutput()
deviceOutput.videoSettings=[kCVPixelBufferPixelFormatTypeKey作为字符串:Int(kCVPixelFormatType_32BGRA)]
deviceOutput.setSampleBufferDelegate(self,队列:DispatchQueue.global(qos:DispatchQoS.QoSClass.default))
会话.添加输入(设备输入)
session.addOutput(设备输出)
让cameraPreview=AVCaptureVideoPreviewLayer(会话:会话)
view.layer.addSublayer(cameraPreview)
cameraPreview.frame=view.frame
会议.启动耳轴()
}
func captureOutput(\uOutput:AVCaptureOutput,didOutput sampleBuffer:CMSampleBuffer,from connection:AVCaptureConnection){
如果let barcodeDetector=self.barcodeDetector{
让visionImage=visionImage(缓冲区:sampleBuffer)
条形码检测器。检测(在:visionImage中){(条形码,错误)在
如果let error=error{
打印(错误。本地化描述)
返回
}
用于条形码中的条形码{
打印(barcode.rawValue!)//这是卡号
}
}
}
}    
}

以下是可能的方法

class BarCodeViewModel: ObservableObject {
   @Published var cardNumber: String = ""
}

struct BarcodeView: View {
    @ObservedObject var vm = BarCodeViewModel()

    @State var isShowingCameraView = false
    
    var body: some View {
        CameraView(model: vm)
            .edgesIgnoringSafeArea(.all)
        Text(vm.cardNumber)

    }
}

struct BarcodeView_Previews: PreviewProvider {
    static var previews: some View {
        BarcodeView()
    }
}

//UIKit

struct CameraView : UIViewControllerRepresentable {
    let model: BarCodeViewModel
    let myBarcode: Int = 0
    
    
    
    func makeUIViewController(context: UIViewControllerRepresentableContext<CameraView>) -> UIViewController {
        let controller = BarCodeDetectorViewController()
        controller.bridgeModel = self.model
        return controller
    }
    
    func updateUIViewController(_ uiViewController: CameraView.UIViewControllerType, context: UIViewControllerRepresentableContext<CameraView>) {}
}

class BarCodeDetectorViewController : UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {

    let session = AVCaptureSession()
    lazy var vision = Vision.vision()
    var barcodeDetector :VisionBarcodeDetector?
    var bridgeModel: BarCodeViewModel?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        startLiveVideo()
        self.barcodeDetector = vision.barcodeDetector()
    }
    
    func startLiveVideo() {
        
        session.sessionPreset = AVCaptureSession.Preset.photo
        let captureDevice = AVCaptureDevice.default(for: AVMediaType.video)
                
        let deviceInput = try! AVCaptureDeviceInput(device: captureDevice!)
        let deviceOutput = AVCaptureVideoDataOutput()
        deviceOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey as String: Int(kCVPixelFormatType_32BGRA)]
        deviceOutput.setSampleBufferDelegate(self, queue: DispatchQueue.global(qos: DispatchQoS.QoSClass.default))
        session.addInput(deviceInput)
        session.addOutput(deviceOutput)

        let cameraPreview = AVCaptureVideoPreviewLayer(session: session)
                        
        view.layer.addSublayer(cameraPreview)
        cameraPreview.frame = view.frame

        session.startRunning()
    }
    
    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
            
            if let barcodeDetector = self.barcodeDetector {
                
                let visionImage = VisionImage(buffer: sampleBuffer)
                
                barcodeDetector.detect(in: visionImage) { (barcodes, error) in
                    
                    if let error = error {
                        print(error.localizedDescription)
                        return
                    }
                    
                    for barcode in barcodes! {
                        print(barcode.rawValue!) //here is the card number
                    }

                    DispatchQueue.main.async {
                       self.bridgeModel.cardNumber = ... // << assign here as needed
                    }
                }
            }
        }    
}
类BarCodeViewModel:ObserveObject{
@已发布的var cardNumber:String=“”
}
结构条码视图:视图{
@ObservedObject var vm=BarCodeViewModel()
@状态变量isShowingCameraView=false
var body:一些观点{
CameraView(型号:vm)
.edgesIgnoringSafeArea(.all)
文本(vm.cardNumber)
}
}
结构条形码视图\u预览:预览提供程序{
静态var预览:一些视图{
条形码视图()
}
}
//UIKit
结构CameraView:UIViewControllerRepresentable{
let模型:条形码视图模型
让myBarcode:Int=0
func makeUIViewController(上下文:UIViewControllerRepresentableContext)->UIViewController{
let controller=BarCodeDetectorViewController()
controller.bridgeModel=self.model
返回控制器
}
func updateUIViewController(uUIViewController:CameraView.UIViewControllerType,上下文:UIViewControllerRepresentableContext){}
}
类BarCodeDetectorViewController:UIViewController、AVCaptureVideoDataOutputSampleBufferDelegate{
let session=AVCaptureSession()
lazy-var-vision=vision.vision()
var条码检测器:VisionBarcodeDetector?
var bridgeModel:BarCodeViewModel?
重写func viewDidLoad(){
super.viewDidLoad()
令人吃惊的视频
self.barcode检测器=vision.barcode检测器()
}
func视频(){
session.sessionPreset=AVCaptureSession.Preset.photo
让captureDevice=AVCaptureDevice.default(对于:AVMediaType.video)
让deviceInput=try!AVCaptureDeviceInput(设备:captureDevice!)
让deviceOutput=AVCaptureVideoDataOutput()
deviceOutput.videoSettings=[kCVPixelBufferPixelFormatTypeKey作为字符串:Int(kCVPixelFormatType_32BGRA)]
deviceOutput.setSampleBufferDelegate(self,队列:DispatchQueue.global(qos:DispatchQoS.QoSClass.default))
会话.添加输入(设备输入)
session.addOutput(设备输出)
让cameraPreview=AVCaptureVideoPreviewLayer(会话:会话)
view.layer.addSublayer(cameraPreview)
cameraPreview.frame=view.frame
会议.启动耳轴()
}
func captureOutput(\uOutput:AVCaptureOutput,didOutput sampleBuffer:CMSampleBuffer,from connection:AVCaptureConnection){
如果let barcodeDetector=self.barcodeDetector{
让visionImage=visionImage(缓冲区:sampleBuffer)
条形码检测器。检测(在:visionImage中){(条形码,错误)在