在Swift中访问其方法之外的数据

时间:2016-08-31 20:01:49

标签: ios swift methods segue qr-code

我的快速代码遇到了问题。问题是我需要在方法之外使用prepareForSegue,因此方法中的数据不能在我的prepareForSegue外部使用。我如何使用外部数据,以便它可以在我的prepareForSegue中使用?

我正在给你我所有的代码,因为它可以全部有用: - )

错误在代码底部用//// - - ////标记。它说:使用未解析的标识符" 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
                
            }
        }
    }
}
    
}




希望你们能帮帮我。

1 个答案:

答案 0 :(得分:0)

您的metadataObj已在captureOutput()函数内声明。您需要将声明移到外面,与captureSession等相同的位置

例如:

var metadataObj: AVMetadataMachineReadableCodeObject?

然后您可以在prepareForSeguecaptureOutput()中使用它。在使用prepareForSegue

之前检查是否为零
if let metadataObj = metadataObj {
   // use metadataObj
}