当前位置: 首页 > 面试题库 >

Swift:无法检测线性类型条形码

司徒斌
2023-03-14
问题内容

我正在编写条形码阅读器应用程序,但无法检测线性类型的条形码,即代码128。我对Qr代码,EAN13类型和ISBN类型没有任何疑问。我的代码非常简单:

func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {

        if metadataObjects.count != 0 {
            if let object = metadataObjects[0] as? AVMetadataMachineReadableCodeObject {
                if object.type == AVMetadataObject.ObjectType.qr {
                    if let text = object.stringValue {
                        print(text)

                        session.stopRunning()

                        let alertVC = UIAlertController(title: "QR Code", message: text, preferredStyle: UIAlertControllerStyle.alert)
                        alertVC.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action) in
                            self.session.startRunning()
                        }))
                        present(alertVC, animated: true, completion: nil)
                    }
                } else {
                    if let text = object.stringValue {
                        print("Other code detected: ", text)
                    }
                }
            }
        }

我使用了这个免费的在线条形码生成器来测试我的应用。除线性代码外,我还能检测到其他大多数条形码。有人也遇到过这样的问题吗?


问题答案:

[.code128]设置AVCaptureMetadataOutput对象类型时,请确保包括AVMetadataObjectTypeCode128Code
metadataObjectTypes

metadataOutput.metadataObjectTypes = [.qr, .ean13, .code128]

如果要允许所有可用的元数据对象类型,则可以使用
AVCaptureMetadataOutput属性availableMetadataObjectTypes,该属性返回所有可用的类型:

metadataOutput.metadataObjectTypes = metadataOutput.availableMetadataObjectTypes

如果要允许除第一个面之外的所有面,则可以删除availableMetadataObjectTypes的第一个元素。请注意,Apple可能会在不久的将来更改元数据元素的顺序,因此最好仅手动选择应用程序所需的条形码类型:

metadataOutput.metadataObjectTypes =  Array(metadataOutput.availableMetadataObjectTypes.dropFirst())

关于实际代码的几点说明。您不应该检查元素计数是否等于零来检查其是否为空。Array恰好具有一个名为isEmpty的属性if !metadataObjects.isEmpty { //...。另一个选择是,如果仅使用数组的第一个元素,我建议使用Array
.first而不是使用下标[0],它返回一个可选元素,AVMetadataObject?并且AVMetadataObject.ObjectType在您的比较中是多余的:

if let object = metadataObjects.first as? AVMetadataMachineReadableCodeObject {
    if object.type == .qr {
        if let text = object.stringValue {
            print(text)
            session.stopRunning()
            let alertVC = UIAlertController(title: "QR Code", message: text, preferredStyle: .alert)
            alertVC.addAction(UIAlertAction(title: "Ok", style: .default) { _ in
                self.session.startRunning()
            })
            present(alertVC, animated: true)
        }
    }
    else
    if let text = object.stringValue {
        print("Other code detected: ", text)
    }
}


 类似资料:
  • 问题内容: 我正在尝试从Objective-C 访问Swift类的属性。 在另一个视图控制器中,我尝试按以下方式进行访问: 而我得到 在类型’BusinessDetailViewController *’的对象上找不到属性’lat’ 为什么我不能访问此属性?我想念什么? 问题答案: 非Objective-C类型的可选值不会桥接到Objective-C中。也就是说,前三个属性下面 会 是在Objec

  • 我之前通过调用成功地用Tika解析了所有类型的文件,而没有设置任何自定义配置或元数据。现在我需要根据MIME-Type过滤文件进行解析。 我可以用找到mime-type,但是在调用之后,tika使用EmptyParser,检测到的内容类型是“application/octet-stream”。这是默认值,意味着tika无法找到它是什么类型的文件。我试图在解析文件之前设置元数据中的内容类型,但这导致

  • 问题内容: 在测试服务器上,它可以工作;在Appengine上,它会被application / octet-stream覆盖。 我如何告诉Appengine停止这样做? 我的配置文件: 问题答案: 我相信它在本地运行的原因是您的系统在/etc/mime.types或等效文件中为.otf扩展名定义了必需的mime类型。 AppEngine可能没有。因此,您必须给它一些有关正确的MIME类型的提示。

  • 让我们创建一个Potion文件作为插件的测试样本。 :::text factorial = (n): total = 1 n to 1 (i): total *= i. total. 10 times (i): i string print '! is: ' print factorial (i) string print

  • 我构建了以下内容: 上面的代码非常好,非常棒。然而,我仍然想要更多。我希望允许任何Iterable,而不是指定我的HList将包含列表。这样地: 第二个版本无法编译,并显示消息“无法找到参数映射器的隐式值:shapeless.ops.hlist.mapper[iterateOverHList.type,shapeless:[List[Int],shapeless:[List[String],sha

  • 第一种instanceof Array 来检测数组 if(value instanceof Array){ //数组操作 } 第二种使用Array.isArray()来检测数组 if(Array.isArray(value)){ //数组操作 }