【问题标题】:How do I pass a string from UIViewController back to a SwiftUI View (iOS)如何将字符串从 UIViewController 传递回 SwiftUI 视图(iOS)
【发布时间】: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


    【解决方案1】:

    而不是在Coordinator中传递self(这是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
            ...
        }
    }
    

    【讨论】:

    • 谢谢,我真的不需要 UITextViewDelegate,因为没有任何文本,对吗?对于 metadataOutput 函数,我只需要 AVCaptureMetadataOutputObjectsDelegate 即可。感谢您的快速回复,我会试一试
    • 是的,刚刚更正了我的示例中的委托协议
    猜你喜欢
    • 2020-10-08
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    相关资源
    最近更新 更多