我正在使用AppCoda(http://www.appcoda.com/qr-code-reader-swift/#comments)中的QR代码阅读器代码并将其转换为Swift 3.基本代码完全正常。
但是,我想要实现的是从QR读取器检索String,将其存储在变量中,并将变量传递给后面的视图控制器。所以我添加了一些代码来获得以下内容:
func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) {
if metadataObjects == nil || metadataObjects.count == 0 {
qrCodeFrameView?.frame = CGRect.zero
messageLabel.text = "No barcode/QR code is detected"
return
}
let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
if supportedBarCodes.contains(metadataObj.type) {
let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj)
qrCodeFrameView?.frame = barCodeObject!.bounds
if metadataObj.stringValue != nil {
messageLabel.text = metadataObj.stringValue
}
//
//
// CODE I ADDED STARTS BELOW
//
performSegue(withIdentifier: "showMenu", sender: self)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showMenu"{
let tabVc = segue.destination as! UITabBarController
let navVc = tabVc.viewControllers?.first as! UINavigationController
let menuVc = navVc.viewControllers.first as! MenuViewController
menuVc.qrScan = self.messageLabel.text
}
它实际上实现了我想要它做的事情,但它以某种方式触发" performSegue"多次。第一个segue的过渡动画中途,然后第二个发生。
segue" showMenu"是一个手动segue,从QR阅读器视图的视图控制器连接到一个标签栏控制器,它包含一个导航控制器和菜单视图控制器。
我尝试的事情:
在菜单视图控制器的viewdidload函数中打印传递的变量。字符串打印两次。
在QR阅读器视图中添加了一个隐藏按钮,并更改了" showMenu"的segue连接。从视图控制器到按钮。已删除从代码执行segue。在将相机固定到位以扫描qr代码的同时,按下按钮可执行预期功能,并且仅触发segue一次。
使用与(2)相同的设置,我在扫描qr代码时使用内部修饰事件以编程方式触发按钮。 segue被触发两次。
为performSegue和正上方的if子句添加了断点。扫描完东西之后,按下"继续执行程序"按钮,程序在两个断点之间循环。
如果有人能在这里稍微启发我,我将非常感激。非常感谢大家的帮助。
答案 0 :(得分:5)
通过在执行segue之后添加以下代码行来解决此问题:
self.captureSession?.stopRunning()
然而,为什么不解除segue的问题仍然存在类似的问题。
答案 1 :(得分:0)
我刚刚解决了同样的问题。您必须创建前一个视图的展开。
要在界面构建器中执行此操作,您必须从控制器中按住Ctrl键拖动到您实际所在的控制器中的出口(而不是您想要展开的控制器)。
完成此操作后,您必须为此展开segue设置一个标识符(在您的情况下" showMenu"。为此,您必须从左侧部分的场景菜单中展开segue并在“属性”检查器上设置标识符名称。