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

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

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

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

Q&A

解決済

1回答

826閲覧

カメラスクロール画像を別画面で使用し、元ページへ戻った際にも画像を使用したい

mickeydog

総合スコア10

Swift

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

0グッド

0クリップ

投稿2021/11/23 12:43

編集2021/11/25 13:15

前提・実現したいこと

初めてアプリ開発に取り組む初心者です。
カメラスクロールから取得・表示した画像を別画面で表示し、ページへ戻ったときも画像を使用したく、別ページへは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

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

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

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

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

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

hoshi-takanori

2021/11/23 16:10

MapViewController の back メソッドで新しく ScrollMapViewController を作って (使わずにそのまま捨てて) ますが、既存の ScrollMapViewController に画像をセットすべきでは。 また、ScrollMapViewController の viewDidLoad で UIImagePickerController を開いちゃってるのも気になりますね…。
mickeydog

2021/11/23 21:40 編集

ありがとうございます。 初投稿で質問した内容の編集方法がわからず一旦こちらへ対応した内容記載します。(分かり次第修正します) 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
mickeydog

2021/11/25 13:19

別の問題発生しましたが記載アドバイスから質問の挙動は実現出来ました。(コード修正しました) ありがございます、とても助かりました。 viewDidLoadのUIImagePickerControlleはトップページで押したボタンのtagから飛ぶようにしました。 まだ書けていませんがカメラ起動からの画像取得を予定しています。
mickeydog

2021/11/25 13:45

hoshi-takanori様 初利用で理解していないのですがベストアンサーへ選ぶには追記・修正の依頼では出来ない?みたいです。 お手数でなければ回答コメントいただければと思います。
hoshi-takanori

2021/11/26 01:06

自分が書いたのは解答というよりはヒント程度のものなので、それをもとにどう解決されたかを解答欄に書いて自己解決にしていただければと思います。
guest

回答1

0

自己解決

hoshi-takanori様から回答に近いヒントをいただきコード修正し実現出来ました。
自分でも事前に調べたつもりでいましたが似た質問・情報も多数見つかり調査不足でした。

swift

1// backのコードを下記へ修正 2let mapVC = self.navigationController! 3let scrollVC = mapVC.viewControllers[mapVC.viewControllers.count-2] as! ScrollMapViewController 4scrollVC.imageView = self.MapImageView 5scrollVC.reSetupImageView() 6 7// 元画面側でaddSubview(遷移先画面から出来るのもしれませんがそこは分かりませんでした) 8self.scrollView.addSubview(imageView)

投稿2021/11/26 02:05

mickeydog

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問