У меня возникли проблемы с моим быстрым кодом. Проблема в том, что мне нужно, чтобы моя подготовка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
}
}
}
}
}
Надеется, что вы, ребята, можете мне помочь.
теперь я добавил свой код на свой пост, а также пытался в Xcode, но я все еще получаю ошибку. На самом деле у меня сейчас двое. В 'if let metadataObj = metadataObj {' он говорит, что я должен вставить; после, если ... И он продолжает это говорить. Я также по-прежнему получаю сообщение об ошибке «sendToDetailViewController.viaSegue = metadataObj.stringValue», говорящий «Переменная, используемая в пределах своего собственного начального значения» ... Не могу понять это. –
Я также попытался поместить ваши if let metadataObj и т. Д. И т. Д. код сразу после части, где он говорит 'if let qrCodeFrameView = qrCodeFrameView {}', и это устраняет ошибки, но затем я должен удалить переопределение и он по-прежнему не меняет мою метку на другом контроллере view :( –
Вы создали новый 'metadataObj' , но вы также создаете еще один в 'captureOutput', вам нужно удалить« let »в' captureOutput'. У вас также есть 'prepareForSegue', завернутый в условие' if'. Это недействительный код. – MirekE