質問: mySelectedImage self.view.addSubview(mySelectedImageView) } } ``` ### 使用している言語 swift Xvode 11.4 ご教授のほど、よろしくお願い致します。
回答: 質問者さんがおっしゃられる「アイコン」というのが、ホーム画面にあるアプリのアイコンのことと仮定しての回答ですが、 > > 現状のswiftの動き > > > 1アイコンをタップすると遷移先のControllerから、フォトライブラリが開く。 > > 2画像を選択すると、遷移前のUIImageViewにセットされる。 > > > ソースを拝見する限り、 1) アプリを起動(アイコンをタップ)すると、最初のビューが開いた瞬間にフォトライブラリが開く 2) 画像を選択すると、遷移後の画面に動的に配置した(コードで記述した)UIImageView に画像が表示される という流れになっており、想定されている流れとは異なっているように思えます。 と言うのも、`ViewController`の`viewDidAppear`で ``` override func viewDidAppear(_ animated: Bool) { self.present(myImagePicker, animated: true, completion: nil) } ``` を実行していますから、画面にビューが表示された瞬間、`myImagePicker`で指定されたビュー(つまり、イメージピッカーが表示されてしまいます。 また、イメージピッカーで画像を選択した後に呼び出される `delegate` で ``` 画像が選択された時に呼ばれる. */ func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: UIImagePickerController.InfoKey : Any]) { //選択された画像を取得. let myImage: AnyObject? = info[UIImagePickerController.InfoKey.originalImage] as AnyObject //選択された画像を表示するViewControllerを生成. let secondViewController = SecondViewController() //選択された画像を表示するViewContorllerにセットする. secondViewController.mySelectedImage = myImage as? UIImage myImagePicker.pushViewController(secondViewController, animated: true) } ``` という処理を行なっていますが、この中で`pushViewController`が呼び出されているため、画面が遷移してしまいます。 ボタンを押した時にイメージピッカーを開くのであれば、`present(myImagePicker, animated: true, completion: nil)`をボタンを押した時の処理の中に記述する必要がありますので、ご確認ください。 `ViewController` はこんな感じになります。 5については、オリジナルのコードのままで大丈夫です。 ``` import UIKit class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate { var myImagePicker: UIImagePickerController! // MARK: 次の画面に移るための BarButtonItem @IBOutlet weak var nextBarButtonItem: UIBarButtonItem! // MARK: 3の遷移前の画面に表示するイメージビュー @IBOutlet weak var sampleView: UIImageView! // 1アイコンをタップするとviewControllerが開く override func viewDidLoad() { super.viewDidLoad() self.title = "設定モード" // MARK: 画像が選択されていないときには BarButtonItem を無効にする nextBarButtonItem.isEnabled = false } //2「フォトライブラリを開く」ボタンを押すとフォトライブラリが起動する @IBAction func photoLibraryButton(_ sender: Any) { // インスタンス生成 myImagePicker = UIImagePickerController() // デリゲート設定 myImagePicker.delegate = self // 画像の取得先はフォトライブラリ myImagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary // 画像取得後の編集を不可に myImagePicker.allowsEditing = false // MARK: ここでイメージピッカーを表示させる present(myImagePicker, animated: true, completion: nil) } /** 画像が選択された時に呼ばれる. */ // MARK: 3ライブラリが閉じると、遷移前のimageViewに表示される。 // ここでは、遷移前の画面に選択したイメージを表示した上、BarButtonItem を有効にするだけ func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { // 選択された画像を取得 if let myImage = info[.originalImage] as? UIImage { // 遷移前の画面に画像を表示する sampleView.image = myImage // BarButtonItem を有効にする nextBarButtonItem.isEnabled = true } // イメージピッカーを消す dismiss(animated: true, completion: nil) } /** 画像選択がキャンセルされた時に呼ばれる. */ func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { // モーダルビューを閉じる self.dismiss(animated: true, completion: nil) } // 4NavigationBarにある、BarButtonItemで、画面遷移を行う。 @IBAction func nextpages(_ sender: Any) { // MARK: セグエを実行する。 performSegue(withIdentifier: "toNext", sender: nil) } // MARK: 4の続き。 // perfomSegue を実行すると、prepare が呼び出される。ここで値渡しを行う override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // segue 名が "toNext" か判断する if segue.identifier == "toNext" { // segue の遷移先が SecondViewController の場合 if let nextVC = segue.destination as? SecondViewController { // 遷移先のプロパティ(変数)に値をコピーする nextVC.mySelectedImage = sampleView.image } } } } ``` 画面デザインはこんな感じです。 ![イメージ説明