前提・実現したいこと
XcodeでQRコードを用いたゲームを作ろうとしています。
QRコードで読み取った文字が正解であれば、次のページに進むようにしたいのですが、QRコードを読み取った後に、どのようにそのデータを用いて画面遷移させればいいのかわかりません。
また、同じQRコードを二回以上読めないようにしたいのですがそれはどうしたらいいでしょうか。回答よろしくお願いします。
(例えば、QRcodeの値がaだった場合は、次のviewcontrollerへ、値がbだった場合は、読み取り失敗(何も起こらない)というようにしたいです。)
該当のソースコード
お恥ずかしいですが、QRコードを読み取る機能はYouTubeを参考に製作しました。
import UIKit
import AVFoundation
class QRcodeViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
@IBOutlet var videoPreview: UIView! var stringURL = String() enum error: Error { case noCameraAvailable case videoInputInitFail } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. do { try scanQRCode() } catch { print("QRコードの読み取りに失敗しました。") } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects:[Any]!, from connection: AVCaptureConnection!) { if metadataObjects.count > 0 { let machineReadableCode = metadataObjects[0] as! AVMetadataMachineReadableCodeObject if machineReadableCode.type == AVMetadataObject.ObjectType.qr { stringURL = machineReadableCode.stringValue! } } } func scanQRCode() throws { let avCaptureSession = AVCaptureSession() guard let avCaptureDevice = AVCaptureDevice.default(for: AVMediaType.video) else { print("カメラがありません。") throw error.noCameraAvailable } guard let avCaptureInput = try? AVCaptureDeviceInput(device: avCaptureDevice) else { print("カメラの読み込みに失敗しました。") throw error.videoInputInitFail } let avCaptureMetadataOutput = AVCaptureMetadataOutput() avCaptureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) avCaptureSession.addInput(avCaptureInput) avCaptureSession.addOutput(avCaptureMetadataOutput) avCaptureMetadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.qr] let avCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: avCaptureSession) avCaptureVideoPreviewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill avCaptureVideoPreviewLayer.frame = videoPreview.bounds self.videoPreview.layer.addSublayer(avCaptureVideoPreviewLayer) avCaptureSession.startRunning() }
}
バージョンは、xcode9,swift 4,iOS 11です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/04/03 14:27
2018/04/03 21:42