実現したいこと
現在QRコードを読み込んでその内容を表示するiOSアプリを製作しています。
QRコードの読み込みはViewControllerとは別にCameraViewControllerで実装しています。
直面している課題
CameraViewControllerのdelegateが常にnilになってしまい、処理がそれ以上実行できません。
処理を依頼する側
swift
1import UIKit 2import Foundation 3import AVFoundation 4 5 6protocol CameraViewControllerDelegate{ 7 func ReadQRcode(data : String) 8} 9 10class CameraViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate { 11 12 var delegate : CameraViewControllerDelegate! 13 14 private var captureSession = AVCaptureSession() 15 16 override func viewDidLoad() { 17 super.viewDidLoad() 18 19 //使用するカメラの設定 20 captureSession.beginConfiguration() 21 let videoDevice = AVCaptureDevice.default(.builtInWideAngleCamera, 22 for: .video, position: .back) 23 guard 24 let videoDeviceInput = try? AVCaptureDeviceInput(device: videoDevice!), 25 captureSession.canAddInput(videoDeviceInput) 26 else {return} 27 captureSession.addInput(videoDeviceInput) 28 29 let QRCodeOutput = AVCaptureMetadataOutput() 30 guard captureSession.canAddOutput(QRCodeOutput) else { 31 return 32 } 33 captureSession.sessionPreset = .photo 34 captureSession.addOutput(QRCodeOutput) 35 captureSession.commitConfiguration() 36 37 QRCodeOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) 38 QRCodeOutput.metadataObjectTypes = [.qr] 39 40 // 背面カメラの映像を画面に表示するためのレイヤーを生成 41 let previewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession) 42 previewLayer.frame = self.view.bounds 43 previewLayer.videoGravity = .resizeAspectFill 44 self.view.layer.addSublayer(previewLayer) 45 46 self.captureSession.startRunning() 47 } 48 49 override func didReceiveMemoryWarning() { 50 super.didReceiveMemoryWarning() 51 // Dispose of any resources that can be recreated. 52 } 53 54 internal func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) { 55 for metadata in metadataObjects as! [AVMetadataMachineReadableCodeObject] { 56 // QRコードのデータかどうかの確認と受け取ったデータの確認 57 if(metadata.type == .qr && metadata.stringValue != nil){ 58 self.delegate?.ReadQRcode(data: metadata.stringValue ?? "failed") 59 if delegate == nil{print("delegate is nil.")} 60 self.captureSession.stopRunning() 61 } 62 } 63 } 64} 65
処理を実行する側
swift
1import UIKit 2 3class ViewController: UIViewController,FUIAuthDelegate, CameraViewControllerDelegate{ 4 5 @IBOutlet weak var qrButton: UIButton! 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 //... 10 CameraViewController().delegate = self 11 } 12 13 @objc func QRButtonTaped(sender: AnyObject) { 14 self.present(CameraViewController(), animated: true, completion: nil) 15 } 16 //... 17}
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/26 00:23