🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2925閲覧

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional valueのエラー

Kaguya_4869

総合スコア117

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/09/16 10:05

#質問したいこと
現在カメラを使うアプリを作成中です。
画面推移をする時にThread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional valueというエラーが出てしまいます。
#コード

swift

1 2import UIKit 3import AVFoundation 4class CameraViewController: UIViewController { 5 6 7 8 9 10 var captureSession = AVCaptureSession() 11 12 //カメラの画質の決定 13 func setupCaptureSession() { 14 captureSession.sessionPreset = AVCaptureSession.Preset.photo 15 } 16 17 //カメラデバイスそのものを管理するオブジェクトの作成 18 //メインカメラの管理オブジェクトの作成 19 var mainCamera: AVCaptureDevice? 20 //インカメの管理オブジェクトの作成 21 var innnerCamera: AVCaptureDevice? 22 //現在使用しているカメラデバイスの管理オブジェクトの作成 23 var currentDevice: AVCaptureDevice? 24 25 @IBOutlet weak var cameraButton: UIButton! 26 27 28 func setupDevice() { 29 //カメラデバイスのプロパティ設定 30 let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera], mediaType: AVMediaType.video, position: AVCaptureDevice.Position.unspecified 31 ) 32 33 //プロパティの条件を満たしたカメラデバイスの取得 34 let devices = deviceDiscoverySession.devices 35 36 for device in devices { 37 if device.position == AVCaptureDevice.Position.back { 38 mainCamera = device 39 }else if device.position == AVCaptureDevice.Position.front{ 40 innnerCamera = device 41 } 42 } 43 //起動時のカメラを設定 44 currentDevice = mainCamera 45 46 } 47 48 //キャプチャー出力データを受け付けるオブジェクト 49 var photoOutput : AVCapturePhotoOutput? 50 51 //入出力データの設定 52 func setupInputOutput(){ 53 do { 54 // 55 let captureDeviceInput = try AVCaptureDeviceInput(device: currentDevice!) 56 // 57 captureSession.addInput(captureDeviceInput) 58 // 59 photoOutput = AVCapturePhotoOutput() 60 // 61 photoOutput!.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format: [AVVideoCodecKey : AVVideoCodecKey])], completionHandler: nil) 62 captureSession.addOutput(photoOutput!) 63 }catch{ 64 print(error) 65 } 66 } 67 68 // 69 var cameraPreviewLayer : AVCaptureVideoPreviewLayer? 70 71 // 72 func setupPreviewLayer(){ 73 // 74 self.cameraPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill 75 // 76 self.cameraPreviewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait 77 78 self.cameraPreviewLayer?.frame = view.frame 79 self.view.layer.insertSublayer(self.cameraPreviewLayer!, at: 0) 80 } 81 82 func styleCaptureButton(){ 83 cameraButton.layer.borderColor = UIColor.white.cgColor 84 cameraButton.layer.borderWidth = 5 85 cameraButton.clipsToBounds = true 86 cameraButton.layer.cornerRadius = min(cameraButton.frame.width, cameraButton.frame.height) / 2 87 } 88 89 @IBAction func cameraButton_TouchUpInside(_ sender: Any){ 90 let settings = AVCapturePhotoSettings() 91 //フラッシュの設定 92 settings.flashMode = .auto 93 //カメラの手ブレ補正 94 settings.isAutoStillImageStabilizationEnabled = true 95 //撮影された画像をdelegateメソッドで処理 96 self.photoOutput?.capturePhoto(with: settings, delegate: self as! AVCapturePhotoCaptureDelegate) 97 } 98 99 100 101 override func viewDidLoad() { 102 super.viewDidLoad() 103 104 setupCaptureSession() 105 setupDevice() 106 setupInputOutput() 107 setupPreviewLayer() 108 captureSession.startRunning() 109 110 // Do any additional setup after loading the view. 111 } 112 113 114 /* 115 // MARK: - Navigation 116 117 // In a storyboard-based application, you will often want to do a little preparation before navigation 118 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 119 // Get the new view controller using segue.destination. 120 // Pass the selected object to the new view controller. 121 } 122 */ 123 124} 125 126extension CameraViewController: AVCapturePhotoCaptureDelegate{ 127 //撮影した画像データが生成された時に呼び出されるdelegateメソッド 128 func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) { 129 if let imageData = photo.fileDataRepresentation(){ 130 //Data型をUIImageオブジェクトに変換 131 let uiImage = UIImage(data: imageData) 132 //写真ライブラリーに画像を保存 133 UIImageWriteToSavedPhotosAlbum(uiImage!, nil, nil, nil) 134 } 135 } 136} 137

#参考にしたサイト
https://qiita.com/t_okkan/items/b2dd11426eab107c5d15
こちらのサイトをもとに今回のアプリを作成しました。
#関連付け
こんな感じで関連付けをしています。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hameji

2019/09/16 14:17

どこの部分がnilと言っているんですか??? コードが止まるとこを示してください。
guest

回答1

0

ベストアンサー

実際にどこでクラッシュしているかは不明ですが...
下記が怪しい気がします。

swift

1// setupInputOutput() 2let captureDeviceInput = try AVCaptureDeviceInput(device: currentDevice!) //setupDevice()でmainCameraが取得できておらずcurrentDeviceがnilになっているかも? 3 4// setupPreviewLayer() 5self.view.layer.insertSublayer(self.cameraPreviewLayer!, at: 0)//cameraPreviewLayerの初期化処理がないのでnilになっているかも?

下記参考にブレークポイントを設定してクラッシュした箇所を探るのが確実だと思います。
https://qiita.com/mono0926/items/bf70c7ef15db046ee163

投稿2019/09/28 17:48

usagi001

総合スコア208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kaguya_4869

2019/09/28 22:46

ありがとうございます! 解決できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問