如何将字符串从UIViewController传递回SwiftUI视图(iOS)

如何将字符串从UIViewController传递回SwiftUI视图(iOS),swiftui,Swiftui,很抱歉,这似乎是一个简单的问题/答案,但我无法解决这个问题,也无法找到解决方案。我需要使用AVFoundation来开发我正在编写的应用程序。基本上是扫描条形码,然后将该信息发送回另一个ViewController。使用Swift和UIKit,这非常简单/直截了当,而且我已经开始工作了 现在,我使用一个工作表启动ViewController(传入@State变量,以便稍后关闭该工作表): ScanItem是一个UIViewRepresentable 以下是ScanItem中的功能: func m

很抱歉,这似乎是一个简单的问题/答案,但我无法解决这个问题,也无法找到解决方案。我需要使用AVFoundation来开发我正在编写的应用程序。基本上是扫描条形码,然后将该信息发送回另一个ViewController。使用Swift和UIKit,这非常简单/直截了当,而且我已经开始工作了

现在,我使用一个工作表启动ViewController(传入@State变量,以便稍后关闭该工作表):

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>) {
}
我想我在这条路上走对了。此函数通常在viewcontroller的扩展中作为AVCaptureMataOutputObjectsDelegate调用。我想我需要将协调器设置为委托,调用函数,设置一些可绑定变量(@bindable var metadata:String),并在SwiftUI视图中处理它

我当前的错误: 无法构造ScanBarcodeViewController(用于加载相机的我的ViewController),因为它没有可访问的初始值设定项 这与 类ScanBarcodeViewController没有初始值设定项 self.parent.$metaData=metaDataObj.stringValue->无法将类型字符串的值分配给类型绑定--已修复 self.parent.$isPresented=false->无法将Bool类型的值分配给类型绑定--已修复


先谢谢你。如果您需要我发布更多的代码,我很乐意这样做。

而不是传递self-in-Coordinator(结构,如此复制),即

直接使用绑定到您的模型,以便您可以修改它,例如

func makeCoordinator() -> Coordinator {
    return Coordinator(data: $metadata)
}
而且在协调员中

final class Coordinator: NSObject, AVCaptureMetadataOutputObjectsDelegate {
    var data: Binding<String>

谢谢,我并不需要UITextViewDelegate,因为没有任何文本,对吗?对于metadataOutput函数,我只需要avcaptureMataOutputObjectsDelegate,仅此而已。谢谢你的快速回复,我会给它一个简短的回答是的,刚刚修改了代理协议,这是我的例子
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
        ...
    }
}