前提・実現したいこと
初めてアプリ開発に取り組む初心者です。
カメラスクロールから取得・表示した画像を別画面で表示し、ページへ戻ったときも画像を使用したく、別ページへはimageViewを渡し表示出来ましたが、最初のページへ戻ると表示されません。
発生している問題・エラーメッセージ
エラーはありません。
該当のソースコード
Swift
1import UIKit 2var MapButtonItem: UIBarButtonItem! 3class ScrollMapViewController: UIViewController, UIImagePickerControllerDelegate, UIScrollViewDelegate, UINavigationControllerDelegate { 4 var imageView = UIImageView() 5 var scrollView = UIScrollView() 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 MapButtonItem = UIBarButtonItem(image: UIImage(systemName: "binoculars"), 10 style: .plain, target: self, action: #selector(MapButtonTap(sender:))) 11 self.navigationItem.rightBarButtonItems = [MapButtonItem] 12 13 if MenuTagNo == 1 { 14 let picker = UIImagePickerController() 15 picker.sourceType = .photoLibrary 16 picker.delegate = self 17 present(picker, animated: true) 18 self.present(picker, animated: true) 19 } 20 21 let screenWidth:CGFloat = self.view.frame.width 22 let screenHeight:CGFloat = self.view.frame.height 23 self.view.addSubview(imageView) 24 scrollView.frame = CGRect(x: 0, y: 0, width: screenWidth, height: screenHeight) 25 scrollView.bounces = false 26 scrollView.delegate = self 27 scrollView.clipsToBounds = false 28 self.view.addSubview(scrollView) 29 self.scrollView.addSubview(imageView) 30 } 31 @objc func MapButtonTap(sender: UIButton) { 32 let MapVC = storyboard?.instantiateViewController(withIdentifier: "Map") as! MapViewController 33 MapVC.MapImageView = imageView 34 navigationController?.pushViewController(MapVC, animated: true) 35 } 36 37 func reSetupImageView() { 38 self.scrollView.addSubview(imageView) 39 } 40 41 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 42 if let selectedImage = info[.originalImage] as? UIImage { 43 imageView.contentMode = .scaleAspectFit 44 imageView.image = selectedImage 45 guard let size = imageView.image?.size, imageView.frame.isEmpty else { return } 46 let wRate = scrollView.bounds.width / size.width 47 let hRate = scrollView.bounds.height / size.height 48 let rate = min(wRate, hRate, 1) * 5 49 imageView.frame.size = CGSize(width: size.width * rate, height: size.height * rate) 50 scrollView.contentSize = imageView.frame.size 51 } 52 self.dismiss(animated: true) 53 } 54 55 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 56 self.dismiss(animated: true) 57 } 58 }
Swift
1import UIKit 2class MapViewController: UIViewController, UIScrollViewDelegate { 3 var MapImageView = UIImageView() 4 let MapScrollView = UIScrollView() 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 self.navigationItem.hidesBackButton = true 9 let button = UIButton(type: .system) 10 button.addTarget(self, action: #selector(back(_:)), for: .touchUpInside) 11 button.setTitle("Back", for: .normal) 12 button.setImage(UIImage(systemName: "chevron.left"), for: .normal) 13 button.titleLabel?.font = UIFont.systemFont(ofSize: 16) 14 navigationItem.leftBarButtonItem = .init(customView: button) 15 16 let screenWidth:CGFloat = self.view.frame.width 17 let screenHeight:CGFloat = self.view.frame.height 18 MapScrollView.frame = CGRect(x: 0, y: 0, width: screenWidth, height: screenHeight) 19 self.view.addSubview(MapImageView) 20 21 MapScrollView.addSubview(MapImageView) 22 MapScrollView.contentSize = MapImageView.frame.size 23 MapScrollView.bounces = false 24 MapScrollView.delegate = self 25 MapScrollView.clipsToBounds = false 26 self.view.addSubview(MapScrollView) 27 } 28 // Buckボタンのアクション 29 @objc private func back(_ sender: Any) { 30 let mapVC = self.navigationController! 31 let scrollVC = mapVC.viewControllers[mapVC.viewControllers.count-2] as! ScrollMapViewController 32 scrollVC.imageView = self.MapImageView 33 scrollVC.reSetupImageView() 34 self.navigationController?.popViewController(animated: true) 35 }
試したこと
・元画面へ戻る時、元画面のimageViewへ遷移先画面のimageViewを渡した
・元画面から遷移先画面へ戻る際、元画面でUserDefaultsからimageを取得
ネット情報色々検索しましたが知識不足もあり実現出来ません。
ご助言お願いいたします。
補足情報(FW/ツールのバージョンなど)
Xcode 12.0
MapViewController の back メソッドで新しく ScrollMapViewController を作って (使わずにそのまま捨てて) ますが、既存の ScrollMapViewController に画像をセットすべきでは。
また、ScrollMapViewController の viewDidLoad で UIImagePickerController を開いちゃってるのも気になりますね…。
ありがとうございます。
初投稿で質問した内容の編集方法がわからず一旦こちらへ対応した内容記載します。(分かり次第修正します)
backメソッドを下記へ書き換えてみましたがエラーとなってしまいました。対応方法違っていますか?
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
// Buckボタンのアクション
@objc private func back(_ sender: Any) {
let mapVC = self.presentingViewController as! UINavigationController ここでエラー
let scrollVC = mapVC.viewControllers[mapVC.viewControllers.count - 1] as! ScrollMapViewController
scrollVC.imageView = self.MapImageView
別の問題発生しましたが記載アドバイスから質問の挙動は実現出来ました。(コード修正しました)
ありがございます、とても助かりました。
viewDidLoadのUIImagePickerControlleはトップページで押したボタンのtagから飛ぶようにしました。
まだ書けていませんがカメラ起動からの画像取得を予定しています。
hoshi-takanori様
初利用で理解していないのですがベストアンサーへ選ぶには追記・修正の依頼では出来ない?みたいです。
お手数でなければ回答コメントいただければと思います。
自分が書いたのは解答というよりはヒント程度のものなので、それをもとにどう解決されたかを解答欄に書いて自己解決にしていただければと思います。
回答1件
あなたの回答
tips
プレビュー