2016-09-10 3 views
2

Я построил QR-сканер на основе учебника here. Когда приложение запускается, я вижу сканер, и когда он указывается на QR-код, на экране отображается правильный текст. Теперь я хочу иметь кнопку (Продолжить), которая позволит мне перевести текстовое значение, отсканированное (usernameScanned), на следующий контроллер представления. Это не работает, и когда я нажимаю кнопку, приложение вылетает с этой ошибкой:Swift - QR сканер бросает ноль ошибку

fatal error: unexpectedly found nil while unwrapping an Optional value

Это код, у меня есть где хранить текст в переменную usernameScanned:

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

     // Check if the metadataObjects array is not nil and it contains at least one object. 
     if metadataObjects == nil || metadataObjects.count == 0 { 
      qrCodeFrameView?.frame = CGRectZero 
      usernameLabel.text = "No barcode/QR code is detected" 
      return 
     } 

     // Get the metadata object. 
     let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject 

     // Here we use filter method to check if the type of metadataObj is supported 
     // Instead of hardcoding the AVMetadataObjectTypeQRCode, we check if the type 
     // can be found in the array of supported bar codes. 
     if supportedBarCodes.contains(metadataObj.type) { 
      //  if metadataObj.type == AVMetadataObjectTypeQRCode { 
      // If the found metadata is equal to the QR code metadata then update the status label's text and set the bounds 
      let barCodeObject = videoPreviewLayer?.transformedMetadataObjectForMetadataObject(metadataObj) 
      qrCodeFrameView?.frame = barCodeObject!.bounds 

      if metadataObj.stringValue != nil { 
       usernameLabel.text = metadataObj.stringValue 
       self.usernameScanned = metadataObj.stringValue! 
       print(self.usernameScanned) 
      } 
     } 
    } 

и это кнопка продолжить действие:

@IBAction func proceedPressed(sender: AnyObject) 
    { 

     self.performSegueWithIdentifier("viewUserProfileForQR", sender: self) 
    } 

Спасибо за ваш час elp

+0

Установить контрольную точку исключения и показать строку, в которой произошел сбой – Paulw11

+0

проверить, что ваше имя segue в раскадровке является 'viewUserProfileForQR' существуют –

+0

@ Paulw11 это происходит только тогда, когда я нажимаю кнопку и внутри функции, как видно выше, это только один линия. Где бы вы порекомендовали разместить точку останова в этом случае? –

ответ

2

Поскольку код, который вы отправили, не выбрасывает ошибку, попробуйте проверить контроллер просмотра, который вы пытаетесь выполнить, до того, как вы нажмете кнопку.

Вы можете иметь переменные, которые не инстанцированы, например

var userNameProfile:String!

в пределах Вашего метода prepareForSegue мне кажется, что вы хотите, чтобы показать результат сканирования (его подробный вид в конце концов) - поэтому вы должны передать это значение от VC1 до VC2 в этом методе.

Смежные вопросы