很抱歉,这似乎是一个简单的问题/答案,但我一直无法弄清这一点,也找不到解决方案。我需要为正在编写的应用程序使用AVFoundation。基本上是扫描条形码,然后将该信息发送回另一个ViewController。借助Swift和UIKit,这非常容易/直接,我已经完成了工作。
现在,我使用工作表启动ViewController(传递@State变量,以便稍后可以关闭工作表):
.sheet(isPresented: $isShowingCamera, content: {
ScanItem(isPresented: self.$isShowingCamera)
})
ScanItem是一个UIViewRepresentable 这是ScanItem中的功能:
func makeCoordinator() -> ScanItem.Coordinator {
return Coordinator(self)
}
public typealias UIViewControllerType = ScanBarcodeViewController
func makeUIViewController(context: UIViewControllerRepresentableContext<ScanItem>) -> ScanBarcodeViewController {
return ScanBarcodeViewController()
}
func updateViewController(_ uiViewController: ScanBarcodeViewController, context: UIViewControllerRepresentableContext<ScanItem>) {
}
在内部,我具有必需的方法,并显示了我创建的另一个UIViewController,该UIViewController使用AVFoundation显示摄像机并查找条形码。我认为我需要进步的地方是使协调器处理AVCaptureMetaData。我的协调员如下:
class Coordinator: NSObject, AVCaptureMetadataOutputObjectsDelegate {
let parent: ScanItem
init(_ parent: ScanItem) {
self.parent = parent
}
func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
let metaDataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
if metaDataObj.stringValue != nil {
self.parent.$metadata = metadataObj.stringValue
self.parent.$isPresented = false
}
}
我认为我在这里的方向正确。通常在视图控制器的扩展中以AVCaptureMetadataOutputObjectsDelegate的形式调用此函数。我想我需要将协调器设置为委托,调用函数,设置一些可绑定变量(@Bindable var元数据:字符串),然后在SwiftUI视图中对其进行处理。
我当前的错误: 无法构造ScanBarcodeViewController(我的加载照相机的viewcontoller),因为它没有可访问的初始化程序 哪一起 类ScanBarcodeViewController没有初始化程序 self.parent。$ metaData = metaDataObj.stringValue->无法将String类型的值分配为Binding类型-已修复 self.parent。$ isPresented = false->无法将Bool类型的值分配给Binding类型-固定
先谢谢您。如果您需要我发布更多代码,我很乐意这样做。
答案 0 :(得分:0)
而不是在协调器中传递自我(它是struct,因此已被复制),即
Coordinator(self)
直接使用绑定到模型,因此可以修改它,例如
func makeCoordinator() -> Coordinator {
return Coordinator(data: $metadata)
}
并在协调器中。.
final class Coordinator: NSObject, AVCaptureMetadataOutputObjectsDelegate {
var data: Binding<String>
...
func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
let metaDataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
if metaDataObj.stringValue != nil {
...
data.wrappedValue = metadataObj.stringValue
...
}
}