27859
## やりたいこと

タイトルの通り、1度だけQRコードを読み取り処理を行いたいのですが  
リーダの範囲にQRコードがあるかぎり連続で読み込んでしまい処理がうまく行きません。  
1度読み込み結果が出た際に読み込みを止めたいのですが、どのようにすればよいでしょうか。

* * *

## コード

```

    class QRCodeReaderVC: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
        var mySession: AVCaptureSession! = AVCaptureSession()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            ...
    
            do {
                let myVideoInput = try AVCaptureDeviceInput(device: myDevice)
                mySession.addInput(myVideoInput)
            } catch {}
    
            let myMetadataOutput: AVCaptureMetadataOutput! = AVCaptureMetadataOutput()
    
            ...
    
            mySession.startRunning()
    
        }
    
        func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
            if metadataObjects.count > 0 {
                let qrData: AVMetadataMachineReadableCodeObject  = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
                let nextVC = storyboard?.instantiateViewControllerWithIdentifier("SecondView") as! SecondViewController
                self.navigationController?.pushViewController(nextVC, animated: true)
            }
        }
    }
    
```
CC BY-SA 3.0
2016-07-26T08:08:36.483
27855
2022-08-10T08:50:32.657
2022-08-10T08:50:32.657
3060
16765
question
swift swift2 qr-code
1回だけQRコードを読み取りたい
QRコードの読み込みが成功したのを確認したら、`AVCaptureSession.stopRunning()`（例のコードでは`mySession.stopRunning()`）を呼んでキャプチャセッションを停止する、

```

    func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
        if metadataObjects.count > 0 {
            let qrData: AVMetadataMachineReadableCodeObject  = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
    
            mySession.stopRunning() // 読み込めたらキャプチャセッションを停止する
    
            let nextVC = storyboard?.instantiateViewControllerWithIdentifier("SecondView") as! SecondViewController
            self.navigationController?.pushViewController(nextVC, animated: true)
        }
    }
    
```

または`isReaderEnabled`のようなフラグを導入してフラグが`true`の時のみデリゲートで処理をして、それ以外の時はQRコードを読み込んでも処理をスキップする、という方法もあります。

```

    func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
        guard isReaderEnabled else { // フラグがtrueの場合だけ処理をする
            return
        }
    
        if metadataObjects.count > 0 {
            let qrData: AVMetadataMachineReadableCodeObject  = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
    
            isReaderEnabled = false // 読み込めたらフラグをオフにする
    
            let nextVC = storyboard?.instantiateViewControllerWithIdentifier("SecondView") as! SecondViewController
            self.navigationController?.pushViewController(nextVC, animated: true)
        }
    }
    
```
CC BY-SA 3.0
2016-07-26T10:04:17.153
27859
2016-07-26T10:04:17.153
5519
27855
answer