gpt4 book ai didi

SwiftUI 从 UIKit 获取数据到 SwiftUI

转载 作者:行者123 更新时间:2023-12-04 03:59:20 24 4
gpt4 key购买 nike

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

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

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
}
}
}
}
}

最佳答案

这是可行的方法

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
}
}
}
}
}

关于SwiftUI 从 UIKit 获取数据到 SwiftUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63338839/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com