问题描述
我是 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 (将#修改为@)