【发布时间】:2020-02-29 02:32:11
【问题描述】:
抱歉,这似乎是一个简单的问题/答案,但我无法弄清楚这一点,也找不到解决方案。我需要将 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,它使用 AVFoundation 来显示相机,并查找条形码。我认为我需要进步的地方是让 Coordinator 处理 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。我想我需要将 Coordinator 设置为委托,调用函数,设置一些可绑定变量(@Bindable var metadata: String)并在 SwiftUI 视图中处理它。
我目前的错误: ScanBarcodeViewController(我的 viewcontoller 加载相机)无法构造,因为它没有可访问的初始化程序 随之而来的是 类 ScanBarcodeViewController 没有初始化器 self.parent.$metaData = metaDataObj.stringValue -> 无法将 String 类型的值分配给 Binding 类型——已修复 self.parent.$isPresented = false -> 无法将 Bool 类型的值分配给 Binding 类型 -- 已修复
提前谢谢你。如果您需要我发布更多代码,我很乐意这样做。
【问题讨论】:
标签: swiftui