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

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

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

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

解決済

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

mickeydog
mickeydog

総合スコア10

Swift

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

1回答

0評価

0クリップ

198閲覧

投稿2021/11/23 12:43

編集2021/11/25 13:15

前提・実現したいこと

初めてアプリ開発に取り組む初心者です。
カメラスクロールから取得・表示した画像を別画面で表示し、ページへ戻ったときも画像を使用したく、別ページへはimageViewを渡し表示出来ましたが、最初のページへ戻ると表示されません。

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

エラーはありません。

該当のソースコード

Swift

import UIKit var MapButtonItem: UIBarButtonItem! class ScrollMapViewController: UIViewController, UIImagePickerControllerDelegate, UIScrollViewDelegate, UINavigationControllerDelegate { var imageView = UIImageView() var scrollView = UIScrollView() override func viewDidLoad() { super.viewDidLoad() MapButtonItem = UIBarButtonItem(image: UIImage(systemName: "binoculars"), style: .plain, target: self, action: #selector(MapButtonTap(sender:))) self.navigationItem.rightBarButtonItems = [MapButtonItem] if MenuTagNo == 1 { let picker = UIImagePickerController() picker.sourceType = .photoLibrary picker.delegate = self present(picker, animated: true) self.present(picker, animated: true) } let screenWidth:CGFloat = self.view.frame.width let screenHeight:CGFloat = self.view.frame.height self.view.addSubview(imageView) scrollView.frame = CGRect(x: 0, y: 0, width: screenWidth, height: screenHeight) scrollView.bounces = false scrollView.delegate = self scrollView.clipsToBounds = false self.view.addSubview(scrollView) self.scrollView.addSubview(imageView) } @objc func MapButtonTap(sender: UIButton) { let MapVC = storyboard?.instantiateViewController(withIdentifier: "Map") as! MapViewController MapVC.MapImageView = imageView navigationController?.pushViewController(MapVC, animated: true) } func reSetupImageView() { self.scrollView.addSubview(imageView) } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let selectedImage = info[.originalImage] as? UIImage { imageView.contentMode = .scaleAspectFit imageView.image = selectedImage guard let size = imageView.image?.size, imageView.frame.isEmpty else { return } let wRate = scrollView.bounds.width / size.width let hRate = scrollView.bounds.height / size.height let rate = min(wRate, hRate, 1) * 5 imageView.frame.size = CGSize(width: size.width * rate, height: size.height * rate) scrollView.contentSize = imageView.frame.size } self.dismiss(animated: true) } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { self.dismiss(animated: true) } }

Swift

import UIKit class MapViewController: UIViewController, UIScrollViewDelegate { var MapImageView = UIImageView() let MapScrollView = UIScrollView() override func viewDidLoad() { super.viewDidLoad() self.navigationItem.hidesBackButton = true let button = UIButton(type: .system) button.addTarget(self, action: #selector(back(_:)), for: .touchUpInside) button.setTitle("Back", for: .normal) button.setImage(UIImage(systemName: "chevron.left"), for: .normal) button.titleLabel?.font = UIFont.systemFont(ofSize: 16) navigationItem.leftBarButtonItem = .init(customView: button) let screenWidth:CGFloat = self.view.frame.width let screenHeight:CGFloat = self.view.frame.height MapScrollView.frame = CGRect(x: 0, y: 0, width: screenWidth, height: screenHeight) self.view.addSubview(MapImageView) MapScrollView.addSubview(MapImageView) MapScrollView.contentSize = MapImageView.frame.size MapScrollView.bounces = false MapScrollView.delegate = self MapScrollView.clipsToBounds = false self.view.addSubview(MapScrollView) } // Buckボタンのアクション @objc private func back(_ sender: Any) { let mapVC = self.navigationController! let scrollVC = mapVC.viewControllers[mapVC.viewControllers.count-2] as! ScrollMapViewController scrollVC.imageView = self.MapImageView scrollVC.reSetupImageView() self.navigationController?.popViewController(animated: true) }

試したこと

・元画面へ戻る時、元画面のimageViewへ遷移先画面のimageViewを渡した
・元画面から遷移先画面へ戻る際、元画面でUserDefaultsからimageを取得
ネット情報色々検索しましたが知識不足もあり実現出来ません。
ご助言お願いいたします。

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

Xcode 12.0

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Swift

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