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
}
}
}
}
}
あなたたちは私を助けることができる願っています。
を今私は私のポストにあなたのコードを追加しても、Xcodeでみましたが、私はまだエラーを取得しています。私は実際に2つ持っています。 'if let metadataObj = metadataObj {'それは私が挿入すべきだと言います;その後...。そしてそれはそれを言っている。私はまだ "sendToDetailViewController.viaSegue = metadataObj.stringValue"というエラーが発生しました。 "自分自身の初期値の中で使われている変数" ...これを理解することはできません。 –
コードを 'if qrCodeFrameView = qrCodeFrameView {}'と言う部分の直後に置いて、エラーを取り除くが、私はオーバーライドを削除して、他のviewcontrollerでラベルを変更しないでください:( –
新しい 'metadataObj'しかし、あなたは 'captureOutput'でも別のものを作成しますが、' captureOutput'の 'let 'を削除する必要があります。' if'条件で 'prepareForSegue'をラップしています。 – MirekE