2016-08-09 2 views
0

두 개의보기가있는 IOS 용 QRCode 스캐너 응용 프로그램에서 작업 중입니다. 내 iPad 2에서 앱을 컴파일하고 실행하고 툴바에서 내 버튼을 클릭하면 두 클래스에서 서브 코드 0xe77ffdefe 인 EXC_BREAKPOINT가 표시됩니다.IOS 용 QRCode 스캐너 응용 프로그램의 치명적인 오류

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

@IBAction func showQRView(sender: AnyObject) 함수의 내용을 대체, 기본 초기화'QRCodeViewController()'않습니다 **하지 * * 그 인스턴스를 반환합니다. – vadian

+0

그럼 어떻게할까요? @vadian – Marco

+0

예를 들어'IBOutlet'을 통해보기 컨트롤러에 대한 실제 참조가 필요합니다 – vadian

답변

0

이 문제는 당신이 설계 한) (QRCodeViewController를 호출하면 뷰에 대해 아무것도 모르는 당신의 QRCodeViewController의 인스턴스를 생성한다는 것입니다 인터페이스 빌더에서. 대신 인스턴스를 인스턴스화하도록 스토리 보드에 지시해야합니다.

스토리 보드를 열고 QRCodeViewController 장면을 선택하십시오. 오른쪽 창 (유틸리티)을 열고 ID 관리자의 상단에있는 아이콘 (작은 ID 카드처럼 보임)을 클릭하십시오. 'Storyboard ID'상자에 고유 한 문자열을 채 웁니다. `secondViewController`이 인터페이스 빌더에서 설계된 경우

이제

, 다시 코드에서, 다음

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

감사합니다 :) – Marco

관련 문제