iOS二维码扫描仪多次触发动作

iOS QR code scanner triggering actions multiple times

我正在使用来自 AppCoda (http://www.appcoda.com/qr-code-reader-swift/#comments) 的 QR 码 reader 代码并将其转换为 Swift 3. 基本代码运行良好。

然而,我想要实现的是从 QR reader 中检索一个字符串,将其存储在一个变量中,并将该变量传递给下面的视图控制器。所以我向其中添加了一些代码以获得以下内容:

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 Reader 视图的视图控制器连接到包含导航控制器和菜单视图控制器的标签栏控制器。

我尝试过的事情:

  1. 在菜单视图控制器的viewdidload函数中打印传递的变量。字符串被打印了两次。

  2. 在 QR reader 视图上添加了一个隐藏按钮,并将 "showMenu" 的 segue 连接从视图控制器更改为按钮。从代码中删除了 perform segue。握住相机扫描二维码,按下按钮执行预期功能,并且只触发一次转场。

  3. 使用与 (2) 相同的设置,我通过在扫描二维码时使用触摸内部事件以编程方式触发按钮。 segue 被触发两次。

  4. 为 performSegue 和它上面的 if 子句添加了断点。在我扫描了一些东西并按下 "continue program execution" 按钮后,程序在两个断点之间不断循环。

如果有哪位大侠能指教一下,感激不尽。提前感谢大家的帮助。

我刚刚解决了同样的问题。您必须创建一个到前一个视图的展开。

要在界面生成器中执行此操作,您必须按住 Ctrl 键并从控制器拖动到您实际所在的控制器(而不是您想要展开的控制器)的出口处。

完成此操作后,您必须为此展开转场设置一个标识符(在您的情况下 "showMenu"。为此,您必须从左侧的场景菜单中展开转场并在属性检查器上设置标识符名称。

通过在执行 segue 后添加以下代码行解决了该问题:

self.captureSession?.stopRunning()

然而,为什么不展开 segue 的问题仍然存在类似的问题。