【问题标题】:Access data outside its method in Swift在 Swift 中访问其方法之外的数据
【发布时间】:2017-01-08 13:02:24
【问题描述】:

我的 swift 代码有问题。问题是我需要在方法之外有我的 prepareForSegue,因此方法内的数据不能在我的 prepareForSegue 之外和之外使用。我怎样才能在外面使用数据,以便它可以在我的 prepareForSegue 中工作?

我把我所有的代码都给你了,因为它对所有这些都是有用的:-)

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

希望你们能帮助我。

【问题讨论】:

    标签: ios swift methods segue qr-code


    【解决方案1】:

    您的metadataObjcaptureOutput() 函数内声明。您需要将声明移到外面,与captureSession 等相同的地方。

    例如:

    var metadataObj: AVMetadataMachineReadableCodeObject?
    

    然后你可以在prepareForSeguecaptureOutput() 中使用它。在prepareForSegue中使用前检查nil:

    if let metadataObj = metadataObj {
       // use metadataObj
    }
    

    【讨论】:

    • 现在我已将您的代码添加到我的帖子中,并在 xcode 中进行了尝试,但仍然出现错误。我现在真的有两个。在if let metadataObj = metadataObj { 中说我应该插入;之后如果.... 它一直这么说。我在这里仍然遇到错误sendToDetailViewController.viaSegue = metadataObj.stringValue 说“变量在其自己的初始值内使用”...无法弄清楚..
    • 我还尝试将您的 if let metadataObj 等代码放在它说 if let qrCodeFrameView = qrCodeFrameView { } 的部分之后,这样可以消除错误,但是我应该删除覆盖,它仍然不会改变我的另一个视图控制器上的标签:(
    • 您创建了新的metadataObj,但您还在captureOutput 中创建了另一个,您需要删除captureOutput 中的“let”。您还将 prepareForSegue 包裹在 if 条件中。这不是一个有效的代码。
    猜你喜欢
    • 1970-01-01
    • 2022-11-21
    • 2017-04-15
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2021-12-04
    相关资源
    最近更新 更多