2016-08-31 8 views
1

私は迅速なコードに問題があります。問題は、メソッドの外でprepareForSegueを持つ必要があるため、メソッド内のデータを外部とprepareForSegueで使用できないことです。私のprepareForSegueで動作するように、データを外部でどうやって使うことができますか?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()の内部で宣言されています。

var metadataObj: AVMetadataMachineReadableCodeObject? 

は、その後、あなたが prepareForSeguecaptureOutput()の両方でそれを使用することができます:あなたはたとえば、あなたの captureSessionなど

を持っているように、外部の同じ場所に宣言を移動する必要があります。 prepareForSegueで使用する前にゼロをチェック:

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

を今私は私のポストにあなたのコードを追加しても、Xcodeでみましたが、私はまだエラーを取得しています。私は実際に2つ持っています。 'if let metadataObj = metadataObj {'それは私が挿入すべきだと言います;その後...。そしてそれはそれを言っている。私はまだ "sendToDetailViewController.viaSegue = metadataObj.stringValue"というエラーが発生しました。 "自分自身の初期値の中で使われている変数" ...これを理解することはできません。 –

+0

コードを 'if qrCodeFrameView = qrCodeFrameView {}'と言う部分の直後に置いて、エラーを取り除くが、私はオーバーライドを削除して、他のviewcontrollerでラベルを変更しないでください:( –

+0

新しい 'metadataObj'しかし、あなたは 'captureOutput'でも別のものを作成しますが、' captureOutput'の 'let 'を削除する必要があります。' if'条件で 'prepareForSegue'をラップしています。 – MirekE

関連する問題