我正在编写条形码阅读器应用程序,但无法检测线性类型的条形码,即代码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)){ //数组操作 }