2016-08-09 29 views
0

Ich arbeite an einer QRCode Scanner App für IOS mit zwei Ansichten. Wenn ich die App auf meinem iPad 2 kompiliere und starte und auf meine Schaltfläche in der Symbolleiste klicke, bekomme ich einen EXC_BREAKPOINT mit dem Subcode 0xe77ffdefe für beide Klassen.Schwerwiegender Fehler in QRCode Scanner App für IOS

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() 



}} 

zweiter Klasse

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

Wenn 'secondViewController' im Interface Builder ausgelegt ist, der Standard initializer' QRCodeViewController() 'tut ** nicht * * gib diese Instanz zurück. – vadian

+0

Wie würde ich es dann tun? @vadian – Marco

+0

Sie benötigen den tatsächlichen Verweis auf den View-Controller zum Beispiel über ein 'IBOutlet' – vadian

Antwort

0

Das Problem ist, dass QRCodeViewController() aufgerufen wird eine Instanz Ihrer QRCodeViewController erstellt, die nichts über die Aussicht nicht weiß, Sie haben entworfen im Interface-Builder. Stattdessen müssen Sie dem Storyboard mitteilen, dass eine Instanz für Sie instanziiert werden soll.

Öffnen Sie das Storyboard und wählen Sie Ihre QRCodeViewControllerszene aus. Öffne den rechten Bereich (Dienstprogramme) und klicke oben auf das Symbol für den Identity Inspector (sieht wie ein kleiner Ausweis aus.) Fülle das Kästchen für 'Storyboard ID' mit einer eindeutigen Zeichenkette aus.

Jetzt in Ihrem Code, zurück, ersetzen Sie den Inhalt Ihrer @IBAction func showQRView(sender: AnyObject) Funktion mit den folgenden

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) 
+0

Danke, dass Sie gearbeitet haben :) – Marco