2016-08-31 2 views
1

У меня возникли проблемы с моим быстрым кодом. Проблема в том, что мне нужно, чтобы моя подготовкаForSegue была вне метода, поэтому данные внутри метода не могут использоваться вне и в моей подготовкеForSegue. Как я могу использовать данные за пределами, чтобы они работали в моей подготовкеForSegue?Доступ к данным за пределами этого метода в Swift

Я даю вам все мой код, так как это может быть полезно все это :-)

Ошибка помеченной //// - - //// вниз в нижней части код. В нем говорится: использование неразрешенного идентификатора «metadataObj».

import UIKit 
 
import AVFoundation 
 

 
class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate { 
 
    
 
    @IBOutlet weak var messageLabel:UILabel! 
 

 
    var captureSession:AVCaptureSession? 
 
    var videoPreviewLayer:AVCaptureVideoPreviewLayer? 
 
    var qrCodeFrameView:UIView? 
 
$$$$$$$$ var metadataObj: AVMetadataMachineReadableCodeObject? 
 
    
 
    let supportedBarCodes = [AVMetadataObjectTypeQRCode, AVMetadataObjectTypeCode128Code, AVMetadataObjectTypeCode39Code, AVMetadataObjectTypeCode93Code, AVMetadataObjectTypeUPCECode, AVMetadataObjectTypePDF417Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeAztecCode] 
 
    
 
    override func viewDidLoad() { 
 
     super.viewDidLoad() 
 

 
     
 
     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 barcode/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 {    
 
       dispatch_async(dispatch_get_main_queue()){ 
 
        self.performSegueWithIdentifier("SendDataSegue", sender: self) 
 
        
 
       } 
 
      } 
 
     } 
 
    } 
 
    
 
    
 
    
 
    if let metadataObj = metadataObj { 
 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
 
     if segue.identifier == "SendDataSegue" { 
 
      if let sendToDetailViewController = segue.destinationViewController as? DetailViewController { 
 
       sendToDetailViewController.viaSegue = metadataObj.stringValue 
 
       
 
      } 
 
     } 
 
    } 
 
} 
 
    
 
}

Надеется, что вы, ребята, можете мне помочь.

ответ

0

Ваш metadataObj указан внутри функции captureOutput(). Вы должны переместить декларацию за пределы, то же место, как у вас есть captureSession и т.д.

Например:

var metadataObj: AVMetadataMachineReadableCodeObject? 

Затем вы можете использовать его как в prepareForSegue и captureOutput(). Проверьте ноль перед использованием в prepareForSegue:

if let metadataObj = metadataObj { 
    // use metadataObj 
} 
+0

теперь я добавил свой код на свой пост, а также пытался в Xcode, но я все еще получаю ошибку. На самом деле у меня сейчас двое. В 'if let metadataObj = metadataObj {' он говорит, что я должен вставить; после, если ... И он продолжает это говорить. Я также по-прежнему получаю сообщение об ошибке «sendToDetailViewController.viaSegue = metadataObj.stringValue», говорящий «Переменная, используемая в пределах своего собственного начального значения» ... Не могу понять это. –

+0

Я также попытался поместить ваши if let metadataObj и т. Д. И т. Д. код сразу после части, где он говорит 'if let qrCodeFrameView = qrCodeFrameView {}', и это устраняет ошибки, но затем я должен удалить переопределение и он по-прежнему не меняет мою метку на другом контроллере view :( –

+0

Вы создали новый 'metadataObj' , но вы также создаете еще один в 'captureOutput', вам нужно удалить« let »в' captureOutput'. У вас также есть 'prepareForSegue', завернутый в условие' if'. Это недействительный код. – MirekE

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