2017-11-02 16 views
1

私は私のアプリでQRコードをスキャンしようとしています(スウィフト4、iOSの11)をスキャンし、私はこのチュートリアルと一緒に続い方法:https://www.hackingwithswift.com/example-code/media/how-to-scan-a-barcodeスウィフト4 - QRコード

しかし、私は私のアプリを実行すると、カメラは表示されませんが、captureOutputと呼ばれる私のメソッドが呼び出されていない、私はいくつかの理由を行なったし、私はこのことから私のそのメソッドを変更:まだ呼び出されていないこの

func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) 

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) 

。私は間違って何をしていますか?ここで

はすべて私のコードです:

import AVFoundation 
import UIKit 

class QRCode: UIViewController, AVCaptureMetadataOutputObjectsDelegate { 

    var captureSession: AVCaptureSession! 
    var previewLayer: AVCaptureVideoPreviewLayer! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     view.backgroundColor = UIColor.black 
     captureSession = AVCaptureSession() 

     guard let videoCaptureDevice = AVCaptureDevice.default(for: .video) else { return } 
     let videoInput: AVCaptureDeviceInput 

     do { 
      videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice) 
     } catch { 
      return 
     } 

     if (captureSession.canAddInput(videoInput)) { 
      captureSession.addInput(videoInput) 
     } else { 
      failed() 
      return 
     } 

     let metadataOutput = AVCaptureMetadataOutput() 

     if (captureSession.canAddOutput(metadataOutput)) { 
      captureSession.addOutput(metadataOutput) 

      metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) 
      metadataOutput.metadataObjectTypes = [.ean8, .ean13, .pdf417] 
     } else { 
      failed() 
      return 
     } 

     previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
     previewLayer.frame = view.layer.bounds 
     previewLayer.videoGravity = .resizeAspectFill 
     view.layer.addSublayer(previewLayer) 

     captureSession.startRunning() 
    } 

    func failed() { 
     let ac = UIAlertController(title: "Scanning not supported", message: "Your device does not support scanning a code from an item. Please use a device with a camera.", preferredStyle: .alert) 
     ac.addAction(UIAlertAction(title: "OK", style: .default)) 
     present(ac, animated: true) 
     captureSession = nil 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 

     if (captureSession?.isRunning == false) { 
      captureSession.startRunning() 
     } 
    } 

    override func viewWillDisappear(_ animated: Bool) { 
     super.viewWillDisappear(animated) 

     if (captureSession?.isRunning == true) { 
      captureSession.stopRunning() 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) { 
     captureSession.stopRunning() 

     if let metadataObject = metadataObjects.first { 
      guard let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject else { return } 
      guard let stringValue = readableObject.stringValue else { return } 
      AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate)) 
      found(code: stringValue) 
     } 

     dismiss(animated: true) 
    } 

    func found(code: String) { 
     print(code) 
    } 

    override var prefersStatusBarHidden: Bool { 
     return true 
    } 

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
     return .portrait 
    } 


} 

答えて

1

あなたはのInfo.plistにカメラの権限を置くことがありますか?

<key>NSCameraUsageDescription</key> 
<string>Camera is required to use this application</string> 
+0

はい、カメラが表示されない場合は、 – user979331

+2

@ user979331が間違った方法の署名を使用しています。 'func metadataOutput(_出力:AVCaptureMetadataOutput、didOutput metadataObjects:[AVMetadataObject]、接続:AVCaptureConnection)' –