在 swift5

问题描述

我是 SWIFT5 的新手,最近遇到了一个问题。 我有一个视图扫描条码,条码是一个orderid。如果它是一个有效的 orderid,将打开订单详细信息页面。 我从“http://www.wepstech.com/bar-qr-code-ios-with-swift-5/?unapproved=1123&moderation-hash=903817b97e2a4e1c7376d53b9fc91525#comment-1123”得到了扫描码,但在我扫描条码有效,我的app就是直接注销了,不知道为什么,非常感谢!

我只添加了getorderDetails函数和prepare函数,如下:

导入 UIKit 导入 AVFoundation

class DriverScanViewController: UIViewController {

@IBOutlet weak var menuBarButton: UIBarButtonItem!

var avCaptureSession: AVCaptureSession!
var avPreviewLayer: AVCaptureVideoPreviewLayer!
var order: DriverOrder?

override func viewDidLoad() {
    super.viewDidLoad()
    
    if self.revealViewController() != nil {
        menuBarButton.target = self.revealViewController()
        menuBarButton.action = #selector(SWRevealViewController.revealToggle(_:))
        self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    }
    
    avCaptureSession = AVCaptureSession()
    dispatchQueue.main.asyncAfter(deadline: .Now() + 2) {
        guard let videoCaptureDevice = AVCaptureDevice.default(for: .video) else {
            self.Failed()
            return
        }
        let avVideoInput: AVCaptureDeviceInput
        
        do {
            avVideoInput = try AVCaptureDeviceInput(device: videoCaptureDevice)
        } catch {
            self.Failed()
            return
        }
        
        if (self.avCaptureSession.canAddInput(avVideoInput)) {
            self.avCaptureSession.addInput(avVideoInput)
        } else {
            self.Failed()
            return
        }
        
        let MetadataOutput = AVCaptureMetadataOutput()
        
        if (self.avCaptureSession.canAddOutput(MetadataOutput)) {
            self.avCaptureSession.addOutput(MetadataOutput)
            
            MetadataOutput.setMetadataObjectsDelegate(self,queue: dispatchQueue.main)
            MetadataOutput.MetadataObjectTypes = [.ean8,.ean13,.pdf417,.qr]
        } else {
            self.Failed()
            return
        }
        
        self.avPreviewLayer = AVCaptureVideoPreviewLayer(session: self.avCaptureSession)
        self.avPreviewLayer.frame = self.view.layer.bounds
        self.avPreviewLayer.videoGravity = .resizeAspectFill
        self.view.layer.addSublayer(self.avPreviewLayer)
        self.avCaptureSession.startRunning()
    }
}


func Failed() {
    let ac = UIAlertController(title: "Scanner not supported",message: "Please use a device with a camera. Because this device does not support scanning a code",preferredStyle: .alert)
    ac.addAction(UIAlertAction(title: "OK",style: .default))
    present(ac,animated: true)
    avCaptureSession = nil
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    
    if (avCaptureSession?.isRunning == false) {
        avCaptureSession.startRunning()
    }
}

override func viewWilldisappear(_ animated: Bool) {
    super.viewWilldisappear(animated)
    
    if (avCaptureSession?.isRunning == true) {
        avCaptureSession.stopRunning()
    }
}

override var prefeRSStatusBarHidden: Bool {
    return true
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

func getorderDetails (orderId: String){
    apimanager.shared.getDriverOrderDetails(orderId: orderId) { (json) in
        if json != nil {
            self.order = DriverOrder(json: json!["order_details"])
            self.performSegue(withIdentifier: "ScanorderDetails",sender: self)
        } else {
            let alertView = UIAlertController(title: "Error!",message: "Couldn't find this order.",preferredStyle: .alert)
            let okAction = UIAlertAction(title: "Ok",style: .cancel) { (action) in
            }
            alertView.addAction(okAction)
            self.present(alertView,animated: true,completion: nil)
        }
    }
}

override func prepare(for segue: UIStoryboardSegue,sender: Any?) {
    if segue.identifier == "ScanorderDetails" {
        let controller = segue.destination as! DriverOrderDetailsViewController
        controller.order = order
    }
}

}

扩展 DriverScanViewController : AVCaptureMetadataOutputObjectsDelegate { func MetadataOutput(_ output: AVCaptureMetadataOutput,didOutput MetadataObjects: [AVMetadataObject],from connection: AVCaptureConnection) { avCaptureSession.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) {
    self.getorderDetails (orderId: code)
}

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)