QRコードで読み取った文字列を関数に渡すと unexpectedly found nil while unwrapping an Optional value エラー
swift初心者です。今開発しているアプリケーションはQRコードから現在地と目的地を取得し、ダイクストラで最短経路を求め案内をするというものなのですが、その途中でつまずいています。QRコードから読み取った文字列をNavigationクラスのNavigation関数に渡してその関数内でラベルに表示させたいのですがunexpectedly found nil while unwrapping an Optional valueが出てしまいます。
ViewController.swiftで現在地と目的地をstartとgoalに格納しその値をstep1関数に渡して最短経路を求めています。step1関数が含まれているコードは割愛しています。それと同時にstとglに読み取った現在地と目的地をString型で格納しています。これをNavigationクラスのNavigation()関数に渡し、storyboard上のラベルに表示したいのですがエラーが出てしまい、迷宮入りしてます。どなたかご指摘、アドバイスお願いします
コードは以下の通りです
ViewController.swift
import UIKit
import AVFoundation
class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
@IBOutlet weak var CaptureView: UIView!
@IBOutlet weak var Label: UILabel!
@IBOutlet weak var Label2: UILabel!
@IBOutlet weak var Caution: UILabel!
var myVideoInput:AVCaptureDeviceInput!
var myMetadataOutput:AVCaptureMetadataOutput!
var myVideoLayer: AVCaptureVideoPreviewLayer!
var start:Int = 0
var goal:Int = 0
var st:String = ""
var gl:String = ""
let mySession: AVCaptureSession! = AVCaptureSession()
var myDevice: AVCaptureDevice!
var a:Int = 0
var route:[Int] = []
override func viewDidLoad() {
super.viewDidLoad()
Caution.text = "スタート地を選択してください"
myDevice = AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: .back)
do {
myVideoInput = try AVCaptureDeviceInput(device:myDevice)
} catch {
print(error)
}
if mySession.canAddInput(myVideoInput) {
mySession.addInput(myVideoInput)
}
myMetadataOutput = AVCaptureMetadataOutput()
mySession.addOutput(myMetadataOutput)
myMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
myMetadataOutput.metadataObjectTypes = [AVMetadataObjectTypeQRCode]
self.myVideoLayer = AVCaptureVideoPreviewLayer(session: mySession) as AVCaptureVideoPreviewLayer
self.myVideoLayer.frame = self.CaptureView.bounds
self.myVideoLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
self.CaptureView.layer.addSublayer(self.myVideoLayer)
func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.myVideoLayer.frame = self.CaptureView.bounds
}
// Viewに追加.
self.view.layer.addSublayer(myVideoLayer)
mySession.startRunning()
}
@IBAction func Start(_ sender: Any) {
a = 1
Caution.text = "QRコードをかざしてください"
}
@IBAction func Goal(_ sender: Any) {
a = 2
Caution.text = "QRコードをかざしてください"
}
func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) {
if metadataObjects.count > 0 {
let qrData: AVMetadataMachineReadableCodeObject = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
print(metadataObjects.flatMap { ($0 as AnyObject).stringValue })
if a == 1{
Label.text = qrData.stringValue
start = Int(qrData.stringValue)!
st = qrData.stringValue
if start != 0 && goal == 0{
Caution.text = "目的地を選択してください"
}
else if start != 0 && goal != 0{
Caution.text = "案内開始を押してください"
}
}
else if a == 2{
Label2.text = qrData.stringValue
goal = Int(qrData.stringValue)!
gl = qrData.stringValue
if start == 0 && goal != 0{
Caution.text = "スタート地を選択してください"
}
else if start != 0 && goal != 0{
Caution.text = "案内開始を押してください"
}
}
}
}
@IBAction func GuideStart(_ sender: Any) {
if start != 0 && goal != 0 && start != goal{
performSegue(withIdentifier: "toVC2", sender: nil)
let dijkstra = Step1()
route = dijkstra.step1(start: start, goal: goal)
print(route)
print(start,goal)
let NV = Navigation()
NV.Navigation(cr: st, gl: gl)
}
else if start == goal{
Caution.text = "同じ地点は選択できません"
}
else if start == 0 && goal != 0{
Caution.text = "スタート地を選択してください"
}
else if start != 0 && goal == 0{
Caution.text = "目的地を選択してください"
}
}
Navigation.swift
import UIKit
import AVFoundation
class Navigation : UIViewController {
@IBOutlet weak var current: UILabel!
@IBOutlet weak var goal: UILabel!
func Navigation(cr:String, gl:String){
current.text = cr
goal.text = gl
}
}