質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

1700閲覧

Unexpectedly found nil while unwrapping an Optional value〜

oimo999

総合スコア3

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2020/05/10 11:33

エラーを消して値の受け渡しを行いたい

オリジナルアプリ作成中なのですが、UINavigationControllerで前の画面に値を渡すことができず困っております。
saveButtonを押した時にUIImageの値をMainViewControllerに渡したいのですが、Unexpectedly found nil while unwrapping an Optional valueのエラーが出て落ちてしまいます。

回答よろしくお願いいたします。

発生している問題・エラーメッセージ

Unexpectedly found nil while unwrapping an Optional value

該当のソースコード

swift

1import UIKit 2import FSCalendar 3 4 5class MainViewController: UIViewController,FSCalendarDelegate,FSCalendarDataSource,FSCalendarDelegateAppearance { 6 7 8 @IBOutlet weak var calendar: FSCalendar! 9 @IBOutlet weak var dateLabel: UILabel! 10 @IBOutlet weak var piechartImageResultView: UIImageView! 11 12 var piechartImageResult: UIImage! 13 14 override func viewDidLoad() { 15 super.viewDidLoad() 16 self.calendar.dataSource = self 17 self.calendar.delegate = self 18 19 piechartImageResultView.image = piechartImageResult 20 } 21 22 23 24// カレンダーの日付がタップされた時の処理 25 func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition){ 26 27 let tmpDate = Calendar(identifier: .gregorian) 28 let year = tmpDate.component(.year, from: date) 29 let month = tmpDate.component(.month, from: date) 30 let day = tmpDate.component(.day, from: date) 31 dateLabel.text = ("(year).(month).(day)") 32 33 34 } 35 36 37 38 39 40 41 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 42 43 if segue.identifier == "toAddPiechart" { 44 45 let nextView = segue.destination as! AddPiechartViewController 46 47 nextView.dateResult = dateLabel.text! 48 } 49 } 50 51 52 53} 54 55

該当のソースコード

swift

1import UIKit 2 3class AddPiechartViewController: UIViewController,UIPickerViewDelegate, UIPickerViewDataSource { 4 5 6 @IBOutlet weak var pieChartView: UIView! 7 @IBOutlet weak var categoryPicker: UIPickerView! 8 @IBOutlet weak var startTimeLabel: UILabel! 9 @IBOutlet weak var endTimeLabel: UILabel! 10 @IBOutlet weak var dateLabel: UILabel! 11 @IBOutlet weak var piechartImageView: UIView! 12 13 14 var dateResult = "" 15 var pickerDataList = ["未選択", "睡眠","勉強","仕事","食事","遊び","運動"] 16 var pickerColor: [UIColor] = [.white, .blue, .red, .brown, .orange, .green, .gray] 17 var selectedPickerColor: UIColor = .white 18 var startRadian = 0.0 19 var endRadian = 0.0 20 var piechartImage: UIImage? 21 22 23 24 25 26 override func viewDidAppear(_ animated: Bool) { 27 super.viewDidAppear(animated) 28 if isMovingToParent { 29 let grayPath = UIBezierPath() 30 grayPath.addArc(withCenter: CGPoint(x: pieChartView.frame.width/2, y: pieChartView.frame.height/2), // 中心 31 radius: self.pieChartView.frame.height/5, // 半径r 32 startAngle: 0.0, // 開始角度 33 endAngle: .pi * 2, // 終了角度 34 clockwise: true) // 時計回り 35 36 let grayLayer = CAShapeLayer() 37 grayLayer.path = grayPath.cgPath 38 grayLayer.fillColor = UIColor.clear.cgColor // 真ん中の塗り色 39 grayLayer.strokeColor = UIColor.white.cgColor // 線の色 40 grayLayer.lineWidth = 40.0 // 線の幅 41 self.pieChartView.layer.addSublayer(grayLayer) 42 } 43 } 44 45 46 override func viewDidLoad() { 47 super.viewDidLoad() 48 49 50 categoryPicker.delegate = self 51 categoryPicker.dataSource = self 52 53 dateLabel.text = dateResult 54 55 56 } 57 58 59 // UIPickerViewのdelegate 60 func numberOfComponents(in pickerView: UIPickerView) -> Int { 61 return 1 62 } 63 64 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 65 return pickerDataList.count 66 } 67 68 func pickerView(_ pickerView: UIPickerView, 69 titleForRow row: Int, 70 forComponent component: Int) -> String? { 71 72 return pickerDataList[row] 73 } 74 75 // PickereViewの選択で色取得 76 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 77 selectedPickerColor = pickerColor[row] 78 } 79 80 81 @IBAction func startTimeSlider(_ sender: UISlider) { 82 let startSliderValue = Int(sender.value) 83 startRadian = Double(startSliderValue) 84 85 if startSliderValue % 2 == 0 { 86 startTimeLabel.text = "(startSliderValue / 2):00" 87 } else { 88 startTimeLabel.text = "(startSliderValue / 2):30" 89 } 90 } 91 92 @IBAction func endTimeSlider(_ sender: UISlider) { 93 let startSliderValue = Int(sender.value) 94 endRadian = Double(startSliderValue) 95 96 if startSliderValue % 2 == 0 { 97 endTimeLabel.text = "(startSliderValue / 2):00" 98 } else { 99 endTimeLabel.text = "(startSliderValue / 2):30" 100 } 101 } 102 103 @IBAction func addButton(_ sender: UIButton) { 104 105 let timeRadian = .pi * 2.0 / 48.0 106 107 let grayPath = UIBezierPath() 108 grayPath.addArc(withCenter: CGPoint(x: self.pieChartView.frame.width/2, y: self.pieChartView.frame.height/2), // 中心 109 radius: self.pieChartView.frame.height/5, // 半径r 110 startAngle: CGFloat(.pi * -0.5 + startRadian * timeRadian), // 開始角度 111 endAngle: CGFloat(.pi * -0.5 + endRadian * timeRadian), // 終了角度 112 clockwise: true) // 時計回り 113 114 let grayLayer = CAShapeLayer() 115 grayLayer.path = grayPath.cgPath 116 grayLayer.fillColor = UIColor.clear.cgColor // 真ん中の塗り色 117 grayLayer.strokeColor = selectedPickerColor.cgColor // 線の色 118 grayLayer.lineWidth = 40.0 // 線の幅 119 self.pieChartView.layer.addSublayer(grayLayer) 120 } 121 122 @IBAction func saveButton(_ sender: UIButton) { 123 piechartImage = piechartImageView.toImage() 124 125 let nvc = self.presentingViewController as! UINavigationController 126 let index = nvc.viewControllers.count - 2 127 let vc = nvc.viewControllers[index] as! MainViewController 128 vc.piechartImageResult = self.piechartImage 129 130 self.navigationController?.popViewController(animated: true) 131 132 } 133} 134

該当のソースコード

swift

1import Foundation 2import UIKit 3 4/// UIView拡張(イメージ) 5public extension UIView { 6 7 func toImage() -> UIImage { 8 UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, 0.0) 9 guard let context = UIGraphicsGetCurrentContext() else { 10 print("現在のコンテキストを取得できませんでした。") 11 return UIImage() 12 } 13 14 self.layer.render(in: context) 15 16 guard let image = UIGraphicsGetImageFromCurrentImageContext() else { 17 print("ビューをイメージに変換できませんでした。") 18 return UIImage() 19 } 20 21 UIGraphicsEndImageContext() 22 23 return image 24 } 25 26} 27

試したこと

AddpiechartViewController下部のsaveButtonを押した時にpiechartImageを渡したいですが、segueを使わない値に渡し方がわかりません。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

presentingViewControllerに値が入るのは、直前のViewからモーダル遷移(presentで表示)したときのみです。

今回の場合、presentingViewControllernil なのですが、それを強制ダウンキャストしているため実行時エラーが出たのだと思います。

概要だけ書けば次のような感じで遷移元クラスのプロパティに値が入ると思います。

swift

1@IBAction func saveButton(_ sender: UIButton) { 2 // presentingViewController が使われるのは遷移元から present で遷移してきた時のみ 3 //let nvc = self.presentingViewController as! UINavigationController 4 5 if let index = navigationController?.viewControllers.count { 6 let vc = navigationController?.viewControllers[index - 2] as? MainViewController 7 8 // 代入 9 vc?.piechartImageResult = .... 10 } 11 12 self.navigationController?.popViewController(animated: true) 13 }

投稿2020/05/10 12:29

TsukubaDepot

総合スコア5086

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問