扫描二维码时,我的视图消失了



我是第一次使用 AVFoundation,我已经让我的脚本工作了......

我正在制作一个票务应用程序,女巫正在扫描票证上的二维码并检查数据库是否使用了。(我隐藏了我的 API 登录信息(。但是一旦我扫描二维码,我的代码就会运行,我在控制台中得到一个票证 Valid plottet,但视图控制器关闭,并返回我的登录页面。

我正在使用此代码,让我的登录页面显示带有二维码的视图控制器。

let viewController:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "scanner") as UIViewController
self.present(viewController, animated: false, completion: nil)

以及带有QR扫描仪的视图控制器。

//
//  scanner.swift
//  GB Billet Scanner
//
//  Created by Benjamin Eibye on 26/12/2017.
//  Copyright © 2017 GymBilletter.dk. All rights reserved.
//
import UIKit
import AVFoundation
import Alamofire
class scanner: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
    @IBOutlet weak var videoPreview: UIView!
    @IBOutlet weak var navnLabel: UILabel!
    let avCaptureSession = AVCaptureSession()
    var returnValue: String = String()
    enum error: Error {
        case noCameraAvailable
        case videoInputInitFail
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Creating session
        do {
            try scanQRCode()
        } catch {
            print("Failed to scan the QR/BarCode")
        }
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
        avCaptureSession.stopRunning()
        if let metadataObject = metadataObjects.first {
            let readableObject = metadataObject as! AVMetadataMachineReadableCodeObject;
            AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
            //print(readableObject.stringValue!);
            navnLabel.text = "Indlæser billet #(readableObject.stringValue!)"
            let urlEnc = "https://domain?token=(String(describing: UserDefaults.standard.object(forKey: "token")!))&ticket=(readableObject.stringValue!)"
            Alamofire.request(urlEnc).responseJSON { response in
                //print(urlEnc)
                //debugPrint(response)
                //print(response.result)
                if let result = response.result.value {
                    let JSON = result as! NSDictionary
                    if JSON["error"] as? Int == 5002 {
                        print("User not Authendicated")
                        print(urlEnc)
                        self.navnLabel.text = "Telefonen er ikke logget ind"
                        self.avCaptureSession.startRunning()
                    } else if JSON["error"] as? Int == 5003 {
                        print("Ticket not Found")
                        self.navnLabel.text = "Billetten blev ikke fundet"
                        self.avCaptureSession.startRunning()
                    } else {
                        // Billetten eksistere
                        print("Billet fundet")
                        if JSON["active"] as! String == "1" {
                            print("ticket Valid")
                            self.avCaptureSession.startRunning()
                        } else {
                            print("Billetten er blevet brugt")
                            self.navnLabel.text = "Billetten er blevet brugt (String(describing: JSON["used_date"]))"
                        }
                    }
                }
            }

        }
        dismiss(animated: true)
    }
    func scanQRCode() throws {
        guard let avCaptureDevice = AVCaptureDevice.default(for: AVMediaType.video) else {
            print("no camera.")
            throw error.noCameraAvailable
        }
        guard let avCaptureInput = try? AVCaptureDeviceInput(device: avCaptureDevice) else {
            print("Faild to init camera.")
            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()

    }
    @IBAction func anuller(_ sender: Any) {
        navnLabel.text = "Scan billet."
        avCaptureSession.startRunning()
    }

    /*
    // MARK: - Navigation
    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */
}
无论

返回什么,都会调用metadataOutput(...)函数末尾的dismiss(animated: true)

最新更新