先ほどまで画面遷移がうまくいっていたのに突然表示されなくなりました エラーとしてはguard let〜の構文で Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional valueが表示されます どなたか原因がわかる方いたら教えてください 以下推移先のコードです import UIKit import CoreImage import DKImagePickerController class EditViewController: UIViewController { @IBOutlet weak var cameraimageView: UIImageView! @IBOutlet weak var roshutuSlider: UISlider! @IBOutlet weak var roshutuLabel: UILabel! @IBOutlet weak var highlightSlider: UISlider! @IBOutlet weak var highlightLabel: UILabel! @IBOutlet weak var saidoSlider: UISlider! @IBOutlet weak var saidoLabel: UILabel! var originalImage : UIImage! = UIImage() let images = UIImage(named: "originalImage") private var ciFilter: CIFilter! private var ciFilter2: CIFilter! private var ciFilter3: CIFilter! var context : CIContext! var context2 : CIContext! var context3 : CIContext! override func viewDidLoad() { super.viewDidLoad() cameraimageView.image = originalImage } //画面表示された直後に呼び出される、毎回呼び出される override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) cameraimageView.image = originalImage guard let ciImage = originalImage.ciImage ?? CIImage(image: originalImage) else { return } //ハイライトのスライダー highlightSlider.maximumValue = 1 highlightSlider.minimumValue = 0 highlightSlider.value = 1 //露出のスライダー roshutuSlider.maximumValue = 3 roshutuSlider.minimumValue = -3 roshutuSlider.value = 0 //彩度のスライダー saidoSlider.maximumValue = 2 saidoSlider.minimumValue = 0 saidoSlider.value = 1 highlightLabel.text = String(highlightSlider.value) roshutuLabel.text = String(roshutuSlider.value) saidoLabel.text = String(saidoSlider.value) // CIFilterの生成 ciFilter = CIFilter(name: "CIHighlightShadowAdjust") ciFilter2 = CIFilter(name: "CIExposureAdjust") ciFilter3 = CIFilter(name: "CIColorControls") context = CIContext() context2 = CIContext() context3 = CIContext() // 入力画像の設定 ciFilter.setValue(ciImage, forKey: kCIInputImageKey) ciFilter2.setValue(ciImage, forKey: kCIInputImageKey) ciFilter3.setValue(ciImage, forKey: kCIInputImageKey) } @IBAction func valueChanged(_ sender: UISlider) { roshutuLabel.text = String(sender.value) // 露出の設定 ciFilter2.setValue(sender.value, forKey: "inputEV") // Filter適応後の画像を表示 if let originalImage = ciFilter2.outputImage { cameraimageView.image = UIImage(ciImage: originalImage) } } @IBAction func valueChanged2(_ sender: UISlider) { highlightLabel.text = String(sender.value) // ハイライトの設定 ciFilter.setValue(sender.value, forKey: "inputHighlightAmount") // Filter適応後の画像を表示 if let originalImage = ciFilter.outputImage { cameraimageView.image = UIImage(ciImage: originalImage) } } @IBAction func valueChanged3(_ sender: UISlider) { saidoLabel.text = String(sender.value) // 彩度の設定 ciFilter3.setValue(sender.value, forKey: "inputSaturation") // Filter適応後の画像を表示 if let filteredImage = ciFilter3.outputImage { cameraimageView.image = UIImage(ciImage: filteredImage) } } @IBAction func back(){ self.dismiss(animated: true, completion: nil) } @IBAction func savePhoto(){ UIImageWriteToSavedPhotosAlbum(cameraimageView.image!, nil, nil, nil) } } ****推移元のコードを以下に記載します************************ import UIKit import Photos import DKImagePickerController class MakeViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate { @IBOutlet var cameraImageView: UIImageView! @IBOutlet var filterButton : UIButton! @IBOutlet var editButton : UIButton! //画像加工するための元となる画像 var originalImage: UIImage! //画像加工するフィルターの宣言 var filter: CIFilter! override func viewDidLoad() { super.viewDidLoad() } //カメラ、カメラロールを使った時に選択した画像をアプリ内に表示するためのメソッド func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){ cameraImageView.image = info[.editedImage] as? UIImage originalImage = cameraImageView.image //カメラで写真撮った後に画像を加工する元画像として記憶しておく dismiss(animated: true, completion: nil) } //撮影した画像を保存するためのメソッド @IBAction func savePhoto(){ UIImageWriteToSavedPhotosAlbum(cameraImageView.image!, nil, nil, nil) } //カメラロールにある画像を読み込むメソッド @IBAction func openAlbum(){ let pickerController = DKImagePickerController() // 選択可能な枚数を20にする pickerController.maxSelectableCount = 20 pickerController.didSelectAssets = { [unowned self] (assets: [DKAsset]) in // 選択された画像はassetsに入れて返却されるのでfetchして取り出す for asset in assets { asset.fetchFullScreenImage(completeBlock: { (image, info) in // ここで取り出せる self.cameraImageView.image = image }) } } self.present(pickerController, animated: true) {} performSegueToEdit() performsegueToFilter() } func performSegueToEdit(){ performSegue(withIdentifier: "toEditViewController", sender: nil) } func performsegueToFilter(){ performSegue(withIdentifier: "toFilterViewController", sender: nil) } @IBAction func back(){ self.dismiss(animated: true, completion: nil) } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "toEditViewController"{ let EditViewController: EditViewController = segue.destination as! EditViewController EditViewController.originalImage = self.originalImage }else if segue.identifier == "toFilterViewController"{ let FilterViewController: FilterViewController = segue.destination as! FilterViewController FilterViewController.originalImage = self.originalImage } } }
originalImage の中身が空なのが気になりますが、その guard let では落ちはしないと思うのですが…。
このコードだけ見ると落ちないように見えますが、実はこのクラスは別の画面からの遷移先でではありませんでしょうか。また、その遷移元でoriginalImageを書き換えてたりしないでしょうか(遷移元でnilを入れてしまえば落ちるので)。
@hoshiーtakanori様 @TsukubaDepot様
お二人の方ご指摘ありがとうございます
こちらが推移先のコードだっため推移元のコードも記載しました。
推移元のコードで、「画像を複数枚選択可能にしよう」と思いDKImagePickerControllerを入れてから画面推移ができなくなったという状況です。
もし改善策がわかりましたら教えていただけると幸いです。
下記のコード
@IBAction func openAlbum(){
//中略
self.present(pickerController, animated: true) {}
performSegueToEdit()
performsegueToFilter()
}
この部分ですが、これはコピーミスでしょうか。
このままだとDKImagePickerControllerの画面が開いた上、2つのSegueを処理するような流れになってしまい、想定通りの動作にはならないと思います(試した感じ、少なくとも遷移先の画面は表示されません)。
MakeViewController で originalImage が nil のまま EditViewController に遷移すれば EditViewController の originalImage も nil になりますね。
改善策としては、@IBOutlet 以外のプロパティには ! を使わず、ちゃんと nil の対応をすることでしょうか。
あと、感想ですが、prepare(for segue:) で変数名にクラス名と同じ EditViewController というのを使っていてびっくりしました。そんなことできるんですね…。
var Int: Int = 0
もできるみたいですね..
回答1件
あなたの回答
tips
プレビュー