iOS QR码扫描程序多次触发操作

时间:2017-03-02 08:32:15

标签: swift segue qr-code

我正在使用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阅读器视图的视图控制器连接到一个标签栏控制器,它包含一个导航控制器和菜单视图控制器。

我尝试的事情:

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

  2. 在QR阅读器视图中添加了一个隐藏按钮,并更改了" showMenu"的segue连接。从视图控制器到按钮。已删除从代码执行segue。在将相机固定到位以扫描qr代码的同时,按下按钮可执行预期功能,并且仅触发segue一次。

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

  4. 为performSegue和正上方的if子句添加了断点。扫描完东西之后,按下"继续执行程序"按钮,程序在两个断点之间循环。

  5. 如果有人能在这里稍微启发我,我将非常感激。非常感谢大家的帮助。

2 个答案:

答案 0 :(得分:5)

通过在执行segue之后添加以下代码行来解决此问题:

self.captureSession?.stopRunning()

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

答案 1 :(得分:0)

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

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

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