IOS的QRCode扫描仪应用程序中的致命错误

时间:2016-08-09 06:34:19

标签: ios swift xcode

我正在使用两个视图的IOS QRCode扫描仪应用程序。当我在iPad 2上编译并启动应用程序并单击工具栏上的我的按钮时,我会在两个类上获得一个EXC_BREAKPOINT,子代码为0xe77ffdefe。

class ViewController: UIViewController {

@IBAction func showQRView(sender: AnyObject){

    let secondView:QRCodeViewController = QRCodeViewController()
    self.presentViewController(secondView, animated: true, completion: nil)

}//end of showQRView



override func viewDidLoad() {
    super.viewDidLoad()





}



override func didReceiveMemoryWarning() {
     super.didReceiveMemoryWarning()



}}

第二课

class QRCodeViewController: UIViewController,AVCaptureMetadataOutputObjectsDelegate {
@IBAction func closeView(sender:AnyObject)
self.dismissViewControllerAnimated(true, completion: nil)
}

@IBOutlet weak var messageLabel:UILabel!

var captureSession:AVCaptureSession?
var videoPreviewLayer:AVCaptureVideoPreviewLayer?
var qrCodeFrameView:UIView?a

let supportedBarCodes = [AVMetadataObjectTypeQRCode, AVMetadataObjectTypeCode128Code, AVMetadataObjectTypeCode39Code, AVMetadataObjectTypeCode93Code, AVMetadataObjectTypeUPCECode, AVMetadataObjectTypePDF417Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeAztecCode]





override func viewDidLoad() {
    super.viewDidLoad()

    messageLabel.frame = CGRectMake(0, 0, 768, 71)
    messageLabel.backgroundColor = UIColor.blackColor()
    messageLabel.textColor = UIColor(colorLiteralRed: 0.0, green: 255.0, blue: 0.0, alpha: 1.0)
    messageLabel.textAlignment = NSTextAlignment.Center

    let captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)

    do {
        let input = try AVCaptureDeviceInput(device: captureDevice)

        captureSession = AVCaptureSession()
        captureSession?.addInput(input)

        let captureMetadataOutput = AVCaptureMetadataOutput()
        captureSession?.addOutput(captureMetadataOutput)

        captureMetadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())

        captureMetadataOutput.metadataObjectTypes = supportedBarCodes

        videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
        videoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
        videoPreviewLayer?.frame = view.layer.bounds
        view.layer.addSublayer(videoPreviewLayer!)

        captureSession?.startRunning()

        view.bringSubviewToFront(messageLabel)

        qrCodeFrameView = UIView()

        if let qrCodeFrameView = qrCodeFrameView {
            qrCodeFrameView.layer.borderColor = UIColor.greenColor().CGColor
            qrCodeFrameView.layer.borderWidth = 2
            view.addSubview(qrCodeFrameView)
            view.bringSubviewToFront(qrCodeFrameView)
        }

    } catch {
        print(error)
        return
    }

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}

func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {

    if metadataObjects == nil || metadataObjects.count == 0 {
        qrCodeFrameView?.frame = CGRectZero
        messageLabel.text = "No QR code is detected"
        return
    }


    let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject


    if supportedBarCodes.contains(metadataObj.type) {

        let barCodeObject = videoPreviewLayer?.transformedMetadataObjectForMetadataObject(metadataObj)
        qrCodeFrameView?.frame = barCodeObject!.bounds

        if metadataObj.stringValue != nil {
            messageLabel.text = metadataObj.stringValue
        }
    }
}

}

1 个答案:

答案 0 :(得分:0)

问题是调用QRCodeViewController()会创建一个QRCodeViewController的实例,该实例对您在界面构建器中设计的视图一无所知。相反,您需要告诉故事板为您实例化实例。

打开故事板并选择您的QRCodeViewController场景。打开右侧窗格(实用程序),然后单击顶部的图标以查看身份检查器(看起来像一张小ID卡。)使用唯一字符串填写“Storyboard ID”框。

现在,回到您的代码中,使用以下

替换@IBAction func showQRView(sender: AnyObject)函数的内容
let storyboard = UIStoryboard(name: "STORY_BOARD_NAME_HERE", bundle: nil)
let secondView = storyboard.instantiateViewControllerWithIdentifier("ID_YOU_SET_EARLIER_HERE") as! QRCodeViewController
self.presentViewController(secondView, animated: true, completion: nil)