エラーを消して値の受け渡しを行いたい
オリジナルアプリ作成中なのですが、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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。