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