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

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

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

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

Q&A

解決済

1回答

1874閲覧

至急案件 画面遷移 ボタン1つ(画像データと文字)

EDM

総合スコア30

Swift

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

0グッド

1クリップ

投稿2020/01/23 03:17

編集2020/02/03 13:08

写真アプリに1.pngという画像データを保存しておき、文字を入力、入力した文字と、画像データのデータ名が** 同じ時** に画面遷移することは可能でしょうか?

写真アプリ 1.png 2.png というデータ名で画像データを保存しておく。

今回作成しているアプリを開き、文字を入力する。「1.png」 決定ボタンをおす(このボタンのみ)

データが存在するとき、ViewController1の画面に画面遷移する。
データが存在しない場合、「データは存在しません」表示をする。

文字を入力 「2.png」 決定ボタンを押す

データが存在するとき、ViewController2の画面に画面遷移する。
データが存在しない場合、「データは存在しません」表示をする

この時のデータを保存している写真アプリは iPhoneにもともとある”写真”というアプリです。

コードとして このように書きましたがどうですか?

Swiift

1import UIKit 2 3import Photos 4 5 6 7class ViewController: UIViewController,UITextFieldDelegate{ 8 9 10 11 var alertController: UIAlertController! 12 13 var nextimage: UIImage! 14 15 func alert1(title:String,message:String){ 16 17 alertController = UIAlertController(title: "データが存在しません", message: "", preferredStyle: UIAlertController.Style.alert) 18 19 alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 20 21 present(alertController, animated: true) 22 23 } 24 25 26 27 func alert2(title:String,message:String){ 28 29 alertController = UIAlertController(title: "データを入力してください", message: "", preferredStyle: UIAlertController.Style.alert) 30 31 alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 32 33 present(alertController, animated: true) 34 35 } 36 37 38 39 override func viewDidLoad() { 40 41 super.viewDidLoad() 42 43 // Do any additional setup after loading the view. 44 45 libraryRequestAuthorization() 46 47 TextField.delegate = self 48 49 TextField.layer.borderWidth = 1.5 50 51 let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: 8, height: 5)) 52 53 TextField.leftView = paddingView 54 55 TextField.leftViewMode = .always 56 57 self.view.addSubview(TextField) 58 59 } 60 61 62 63 override func didReceiveMemoryWarning() { 64 65 super.didReceiveMemoryWarning() 66 67 } 68 69 70 71 fileprivate func libraryRequestAuthorization() { 72 73 PHPhotoLibrary.requestAuthorization({status in 74 75 76 77 switch status { 78 79 case .authorized: 80 81 self.getAllPhotosInfo() 82 83 case .denied: 84 85 print("拒否されました") 86 87 case .notDetermined: 88 89 print("決まっていない") 90 91 case .restricted: 92 93 print("制限あり") 94 95 @unknown default: 96 97 return 98 99 } 100 101 }) 102 103 } 104 105 106 107 fileprivate func getAllPhotosInfo(){ 108 109 let assets = PHAsset.fetchAssets(with: .image, options: nil) 110 111 var isSuccses: Bool = false 112 113 assets.enumerateObjects({ asset, _, _ in 114 115 let name: String = asset.value(forKey: "filename")as! String 116 117 118 119 if (self.TextField.text == name){ 120 121 isSuccses = true 122 123 let manager = PHImageManager.default() 124 125 manager.requestImage(for: asset, targetSize: CGSize(width: 100, height: 100), 126 127 contentMode: .aspectFill, options: nil){ 128 129 (image, info) -> Void in 130 131 self.nextimage = image 132 133 134 135 } 136 137 138 139 } 140 141 }) 142 143 144 145 if isSuccses{ 146 147 self.performSegue(withIdentifier: "toViewController2", sender: nil) 148 149 } else if (TextField.text! == "" ){ 150 151 alert2(title: "", message: "") 152 153 } else { 154 155 alert1(title: "",message: "") 156 157 } 158 159 } 160 161 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 162 163 if segue.identifier == "toViewController2"{ 164 165 let nextVC = segue.destination as! ViewController2 166 167 nextVC.image = self.nextimage 168 169 170 171 } 172 173 } 174 175 @IBOutlet weak var TextField: UITextField! 176 177 178 179 @IBAction func Button(_ sender: UIButton) { 180 181 getAllPhotosInfo() 182 183 } 184 185 186 187 188 189 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 190 191 self.view.endEditing(true) 192 193 } 194 195 196 197 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 198 199 TextField.resignFirstResponder() 200 201 } 202 203 204 205 func textFieldShouldClear(_ textField: UITextField) -> Bool { 206 207 return true 208 209 } 210 211 212 213}

swift

1import UIKit 2 3 4 5class ViewController2: UIViewController { 6 7 8 9 @IBOutlet weak var imageView: UIImageView! 10 11 var image: UIImage! 12 13 var nextVC: UIImage! 14 15 var timer:Timer = Timer() 16 17 18 19 override func viewDidLoad() { 20 21 super.viewDidLoad() 22 23 imageView.image = nextVC 24 25 26 27 // Do any additional setup after loading the view. 28 29 timer = Timer.scheduledTimer(timeInterval: 5.0,target: self,selector: #selector(changeView),userInfo: nil,repeats: false) 30 31 32 33 } 34 35 override func didReceiveMemoryWarning() { 36 37 super.didReceiveMemoryWarning() 38 39 // Dispose of any resources that can be recreated. 40 41 } 42 43 44 45 46 47 @objc func changeView() { 48 49 self.navigationController?.popToRootViewController(animated: true) 50 51 } 52 53 54 55 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

iOSの写真アプリに保存されている写真および動画の操作はPhotoKitを使うのが良いかと思います。

ちょっと分かりにくいのですが、PHAssetクラスにvalue(forkey:)というメソッドがあるのでkeyに"filename"を渡してあげると写真のファイル名が取得できます。

追記

swift

1 fileprivate func getAllPhotosInfo(){ 2 let photoAssetss = PHAsset.fetchAssets(with: .image, options: nil) 3 var isSuccses: Bool = false 4 photoAssetss.enumerateObjects({ asset, _, _ in 5 let name: String = asset.value(forKey: "filename") as! String 6 7 if (TextField.text == name) { 8 isSuccses = true 9 } 10 }) 11 12 if isSuccses { 13 // 一致したので画面遷移 14 self.performSegue(withIdentifier: "ViewController2", sender: nil) 15 } else { 16 // 一致しませんでしたエラー処理 17 } 18 }

投稿2020/01/28 02:36

編集2020/02/03 00:25
bobmax

総合スコア133

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

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

EDM

2020/01/28 03:38

なるほど。自分も前回Photokitを使用していたのですが、Photokitってアルバムとか写真アプリを作るためのやつでは無いのですか? var imageNameStr: String = "1.png" アドバイスの方法で行うとこの一文の所は どのように直すべきでしょうか?
bobmax

2020/01/28 03:57

ドキュメントは読みましたか?PhotoKitを使うと写真の保存や写真の呼び出しが行えます。 その一文をどうこうするレベルではないです。カメラロールの画像を取得する方法が載ったサイトを見つけたのでこちら(https://qiita.com/nnsnodnb/items/6b149a73645206a5600f)を参考にして全件取得を実装し、enumerateObjects内でテキストの入力値と画像のファイル名比較するとよいと思います。
EDM

2020/01/28 04:39

なるほどです。 例えば、今回0番のViewControllerから入力、ボタンを押すことで、1,2...8番までの画面遷移を行う予定ですが、NavigationControllerなどを使い、画面右上にPhotoへいくボタンを設置、PhotoViewContorollerみたいなのを作り、そこで画像を呼び出しするための画面を作成するという感じがよろしいですかね。 あとは assets.enumerateObjects({ [weak self] (asset, index, stop) -> Void in guard let wself = self else { return } これのreturn前に@IBAction func Button(_ sender: UIButton)の分を入れる形ですか?enumerateObjects内というのは
bobmax

2020/01/28 05:07

画像を呼び出しするための画面とは…? 単純にテキスト入力が可能な画面が一個あって、一致した画像によって遷移する画面の2画面があれば良いのではないですか? enumerateObjectsの件はそれでいいと思います。if文をasset.value(forkey:"filename")で取得した画像のファイル名と入力値で比較してあげればOKです。
EDM

2020/01/28 05:27 編集

ごめんなさい。言葉が足りていませんでした。 そちらが送ってくれたリンクを確認すると、結果の画面で画像が表示されていますよね? それを、名前は何でもいいですが、PhotoViewControllerみたいなのを作り、そこで行うということです。 画面遷移については、もともと画像が表示されている画面が8面あります。それで、入力することによって、写真の画像データ名と入力名が同じ時に、画面遷移がするので、必要な画像も、8つです。 なので、入力画面と、画面遷移先が8つ。それと今回のアドバイスにならい、PhotoViewController仮の10画面になりますね。
bobmax

2020/01/28 05:38

…? 今回やりたいことは ①テキスト入力可能な画面が表示される ②画像のファイル名を入力する ③一致した場合、その画像が表示された画面に遷移する で間違いないですか? でしたらPhotoViewController仮はいらないと思うのですが…。 カメラロール内の画像を一覧表示する必要があるのですか?
EDM

2020/01/28 05:41

そうですそうです。その通りです。 そうなんですか!てっきり、Photokitを使うときは、そういう画面が必要なものだとばかり考えていました。 必要はないのですね。
bobmax

2020/01/28 06:05

その必要はないですよ。この例の方はカメラロールの画像を取得してそれを表示するところまでやっていますが、今回は画像を取得したら名前でチェックすればいいだけです。 なのでこの処理自体は最初のテキストを入力する画面で実装すれば問題ないです。 質問と関係ないところなのでスルーしていただいて構いませんが、今回のように似たような複数の画面に遷移する場合は、いくつもVCを作るのではなく、1個のVCに選択した値を渡し、VC表示時にその値を見て表示を切り替えるのがベターです。
EDM

2020/01/28 06:33

遷移先のビューコントローラーを取得。 遷移先ビューコントローラーのインスタンス変数に値をセットする。 画面遷移する。 こういう感じでしょうか? それ+https://teratail.com/questions/109730 このようなので?
bobmax

2020/01/28 06:44

そうですね。 遷移先VCで表示する画像は、その前の画面で名前が一致した画像でしょうか? もしそうであれば、PHAssetから画像が取得できるので、その画像を遷移先VCのインスタンス変数に渡してあげれば、遷移先のVCでは渡ってきた画像を表示するだけですみますね。
EDM

2020/01/28 07:02

なるほど。 一度やってみます。なるべく自分の力でやってみますが、もしまたわからない場合、こちらにて返信してもよろしいですか?
bobmax

2020/01/28 07:10

いいですよ。 もしコードを記載する場合はここでは読みにくいので本文に追記してください。
EDM

2020/01/29 04:36 編集

こんにちは。本文のコードに付け加えました。 あれからアレンジとして、アラート表示の付け加え、見やすいように、整理整頓を行いました。 ただ、入力をして、ボタンを押すことで、入力した文字と、画像のファイル名を比較を行うので、 enumerateObjects内では違うのかなと思い、現在前のと同じ、imageNameStrのの文字と入力文字との比較の状態です。 たぶんgetAllPhotoInfoでカメラロールの画像がSelf?.PhotoAssetsに入っていると思いますが、 そちらと、入力した文字との比較のしかたがわからず。また、いただいた、リンクの例をみるとselfと区別するためかwselfにしていましたが、wselfだとエラーがでて、 guard self wself = self else が guard self != nil elseになったり、 self?.photoAssetsになってる状態です。 @IBAction func Button・・・のif文がカギになるはず
bobmax

2020/01/29 04:49

リンクの内容が何をしようとしているのか理解できていますでしょうか…。あくまで参考にしていただければと張っただけですので。 変にimageNameStrに惑わされていませんか?w imageNameStrはただの文字列なので何の意味もないですよ! enumerateObjectsのところは assets.enumerateObjects({ asset, _, _ in }) こうしてください。 assetはPHAssetクラスです。 あとはassetから名前を取得し比較するだけです。
EDM

2020/01/29 05:11

ありがとうございます。 assetから画像データ名なので、 if let firstAsset = self.photoAssets[0]{ let filename: String = firstAsset.value(forkey: "filename") as! String という形で取得ですよね? それを @IBActionのButtonのところで、 if(filename != "" && TextFiled.text! == filename){ ~~ } という感じでいけますか?
bobmax

2020/01/29 05:28

それだと1個目の画像の名前としか比較できてないと思いますが・・・。 enumerateObjectsは画像の全件取得です。 デバッグするとわかると思いますがenumerateObjects内は画像の件数分ループが回っています。 ですのでenumerateObjects内のassetから名前を取得し、一致していたら画面遷移すればよいです。 提示したリンクでは画像をリスト表示しているのでphotoAssetsに詰めていますが、今回は名前を比較するだけですのでphotoAssetsに詰める必要もないです。詰め直したあとループしてもいいですが、無駄に2回ループを回すことになり非効率です。
EDM

2020/01/29 06:40

すみません。 ちょっとまだ理解ができないのですが、 まずphotoAssetsに詰める必要がないとのことなので、 var photoAssets: Array! = [PHAsset]() こちらの分はいらない。その他のphotoAssetsもいらない。 次に、 assets.enumerateObjects({ asset, _ , _ in "この部分" }) この部分にassetから名前を取得する文言をいれるという理解でよろしいですか? その部分に、let filename: String = asset.value(forkey : "filename") as! String という感じで。まぁ、このままだと、オーバーロードと一致しないというエラーがでますが。 で、ボタンの所で、名前が一致しているかどうか。これがif文の所ですが、今の状態だと、1枚目の画像としか比較できない、ということですか? assetはPHAssetクラスというのは、classの所で宣言 ということですか? いくつも質問ばかり、申し訳ありません。
bobmax

2020/01/30 01:13 編集

assets.enumerateObjectsのところの解釈はそれであってます。 私の環境ではエラーは出ませんが…。それ以外が原因では? 他にエラーになっているところはないですか? if文についてですが、self.photoAssets[0]とindexを指定しているので1枚目としか比較してませんよね? assetがPHAssetクラスっていうのはvalue(forkey : "filename") メソッドが使えますよっていうのを伝えたかっただけなので気にしないでください。
EDM

2020/01/30 02:08

本文のコードを編集しました。 エラーとなっている個所は。 assets.enumerateObjectsの所の"let filename: String = asset.value(forkey: "filename")as! String "の valueのvの所で、引数ラベル(forkey:)は使用可能なオーバーロードと一致しません というエラーです。 あとは、filenameに関して、画像がいくつもあるので、varの変数に直した方がいいと思ったのですがどうですか? var filename: String... if文につきましては、 記述を変えました。text文とfilenameが==の時にしましたが。
bobmax

2020/01/30 02:30

んー、もしかしたらvalueメソッドが使えなくなってしまったのかも。 valueメソッドはdocumentに記載されていないapiなのでいつかダメになる可能性があるのです。補完でvalueメソッド出てきますか?ラベルが変わっただけでvalueメソッドがいるかもしれないので、使えそうなら試してみてください。 根本的な話ですが、getAllPhotosInfo()をどこで呼ぶつもりでいますか? ifについてですが…filenameって文字列と比較しているだけになってますが…。
EDM

2020/01/30 05:58 編集

valueメソッドについて、forkeyのkが小文字だったのが間違いだったみたいです。お手数おかけしました。すみません。 getAllPhotosInfo()をどこで呼ぶつもりか?というと? カメラロールへのアクセスの許可のあとでは?。 if文はそうですね。テキストの文字とfilenameという文字の比較になっていましたね。 となると””←こういうので。比較ですかね? enumerateObjects内のassetから名前を取得というのがよくわかりません。 今現在の状態を本文に追加しました。enumeraObjectsのところとif文ができていません
bobmax

2020/01/30 06:39

コードを書くときは補完に頼りましょう。使えないメソッドはそもそもでてこないし、タイプミスもなくなります! 今現在のコードではgetAllPhotosInfo()をどこでも呼び出してないですよね? getAllPhotosInfo()を実行してちゃんとファイル名が取れていることを確認しましたか?デバッグしてfilenameにファイル名が入っているか、enumerateObjectsがどう動いているかちゃんと確認してください。 その確認ができれば、if文をどこにどう記述するべきかわかるはずです。
EDM

2020/02/02 06:10 編集

コード追記しました 今現在のコードではgetAllPhotosInfo()をどこでも呼び出していないについて これはViewDidLoadの部分で呼び出すという理解でよろしいですか? 確認作業の為、print("aaaa")で確認してましたが、ViewDidLoadにgetAllPhotosInfo)を書くと、aaaaが2回呼び出されましたが大丈夫なのですか? 画像データは”写真”の中のの枚数文取得したのは確認しました。 filenameにファイル名が入っていません。 https://highmoon-miyabi.net/blog/2017/12/13_000458.html こちらのようにしてfilenameを入れようとしているのですが filenameを_にしてという黄色の警告がでます。 Buttonのif文もtextfiled.text == filename はできなくて、assets、asset、asset.filenameいろいろためしてはいるものの、全く反応なしです。
EDM

2020/02/02 06:07 編集

昨日から色々やってますがfilenameが上手く取得できません。_にしたほうがいいのでしょうか。 明日が期日になります。
bobmax

2020/02/03 00:28 編集

何をしようとしているかよくわかりませんが、まだ間に合うのであれば回答にソースを追記したのでgetAllPhotosInfo()をあんな感じにしてください。 で、@IBAction func Button(_ sender: UIButton) {}に元々あった処理を全部消してgetAllPhotosInfo()を呼んでください。また、getAllPhotosInfo()を他で呼んでいるのであればそれは消してください。 これで動くと思います。
EDM

2020/02/03 02:16 編集

コード編集しました。 おはようございます。 getAllPhotoInfoを呼び出すというのはButtonの所で呼び出すということだったのですね。ようやく理解しました。 やってみると、まだうまくいきません。 ためしに写真の名前をaaaa.pngにして入力時もaaaa.pngにしてやってみてもアラートが表示されるだけで if(TextFiled.text == name)はif(self.TExtFiled.text == name)に直せとエラーが
bobmax

2020/02/03 02:16

エラーになるのはボタンをおしたときですか? エラー内容的に「let name: String = asset.value(forKey: "filename") as! String」この一行な気がするんですが、ここにブレークポイント貼ってここで落ちてるか確認してみてください。
EDM

2020/02/03 02:27 編集

let name:Stringの所にブレークポイントはると 横にThread4: breakpoint 1.1 とでます
bobmax

2020/02/03 02:26

いやそうではなく、その行で落ちるか確認したいので、その状態で一回ステップオーバーしてください。
EDM

2020/02/03 02:38

ステップオーバー一回おしたら nameがIMG_0001.JPGになっています。ということはfilenameは取得できているということですね
bobmax

2020/02/03 02:43

ん、コメント編集しました?編集前を見てましたすみません。エラーはなくなったということでいいですか? 名前はとれてそうですね。self.TExtFiled.textは警告とおり直してください。
EDM

2020/02/03 03:00

今カメラロールの中には16枚画像があり、 名前が0.png~9.png,A,png~F.pngと16枚あるのですが 取得しているfilenameだとIMG_0001.PNGと名前と写真が一致しないのです
bobmax

2020/02/03 03:05

その16枚の画像が「0.png~9.png,A,png~F.png」というのはどこでどう確認しましたか? その名前のファイルをどっかから保存したのであれば保存時にリネームされていると思います。 iOSのカメラロールの画像名は保存時リネームされるはずです。
EDM

2020/02/03 03:11 編集

Macで画像作成した時に、その名前で保存しました。 それでairdropでiPhoneに送りました。リネームされているということはIMG_????になってしまっているということですね。 だから1.pngとかで画像を比較する場合、またこちらで画像名を変更する必要があるわけですね
bobmax

2020/02/03 03:50

そうですね。 その辺はそこまで詳しくないので調べていただければと思いますが、iPhoneのカメラロールは保存する際に自動でファイル名をリネームしています(おそらく連番)。 また、カメラロール上のファイル名を変更するのは簡単ではないはずです。(少なくとも自分は知らない)
EDM

2020/02/03 04:51 編集

調べてみたところ、カメラロール以外に保存するときはできるみたいですが、名前を変えても、保存先がカメラロールだったらリネームされる仕様みたいです。 なので、ホーム画面にTextviewであらかじめが画像名を表示するようにしました。また、textFiledも()の部分を入力するよう、あらかじめtext部分に表示するようにしました。 あとは画像を遷移先に渡すようにするだけですが、PHAssetから画像が取得できるので、その画像を遷移先VCのインスタンス変数に渡してあげれば、遷移先のVCでは渡ってきた画像を表示するだけですみますね。 遷移先は@IBOutlet weak var imageVIew: UIimageView! にしていますが 遷移元で var imageView = PHAsset みたいなことですか?
bobmax

2020/02/03 04:50

画像はassetから取れるので簡単です。 let manager = PHImageManager.defaultManager() manager.requestImageForAsset(asset, targetSize: CGSize(width: 140, height: 140), contentMode: .AspectFill, options: nil) { (image, info) in // imageがUIimage } これで取れるので名前が一致したアセットを渡してあげればOKです。 targetSizeとcontentModeはお好みで。 imageを取得してから遷移先に渡してもいいし、assetを渡して遷移先でimageを取得してもいいと思います。
EDM

2020/02/03 05:55 編集

コード追加しました if isSuccses分の下に書きましたが、すごくエラーが出ます。 fixで func と manager; になりました。 Expected '(' in argument list of function declaration Expected '{' in body of function declaration Expected declaration Invalid redeclaration of 'manager()' ちなみに、この書き方が、VC1からimageを取得してVC2に渡すやり方で大丈夫ですか?
bobmax

2020/02/03 06:18

んーこれでいいと思いますが。 fixする前のコードを載せてください。 大丈夫です。
EDM

2020/02/03 06:35

let manager = PHImageManager.defaultManager() manager.requestImageForAsset(asset, contentMode: .AspectFill, options: nil) { (image, info) in } これですね。この分だと,6個のエラーで func と [;] が fixになってますね
bobmax

2020/02/03 06:48

失礼しました これでどうでしょ? let imageManager = PHCachingImageManager() imageManager.requestImage(for: photoAsset, targetSize: CGSize(width: 100, height: 100), contentMode: .aspectFill, options: nil) { (image, info) -> Void in }
EDM

2020/02/03 07:01 編集

すみません。やってみましたが、先ほどのエラーと同じです。 今書いているところは、if isSuccsesの下になりますが、記述する場所が違うのでしょうか? imageManagerのiと.requestImageの.でエラーしています
bobmax

2020/02/03 07:04 編集

ifの下っていうかtrueの中ってことですよね?いいと思いますよ。 let imageManager = PHCachingImageManager()だけでもエラーになってますか? let imageManager = PHCachingImageManager() だけでエラーならその下は↑に引きずられてるだけなのでとりあえず気にしないでください。
EDM

2020/02/03 07:09

if isSuccses{self.performSegue・・・}文の下に つまり、getAllPhotosInfo()の外に書いていたんですが。 isSuccses = true の下に 記述したらエラーが出なくなりました。getAllPhotosInfo外だったのが原因だったのかもしれません
bobmax

2020/02/03 07:16

そりゃメソッドの外に書いたらダメですよ。。。
EDM

2020/02/03 07:27

大変申し訳ありませんでした。 これで PHAssetにある画像がmanagerに格納されるみたいな理解でよろしいのでしょか? それを今度はVC2で func setConfigure(assets: PHAsset) { let manager = PHImageManager() manager.requestImage(for: assets, targetSize: frame.size, contentMode: .aspectFill, options: nil, resultHandler: { [weak self] (image, info) in guard let wself = self, let outImage = image else { return } wself.photoImageView.image = image }) } これを参考に表示するという感じですね
bobmax

2020/02/03 07:32

? 今貼ってもらったコードまで既にできていますが・・・? これを参考にっていうか同じ内容ですが・・・。 imageManager.requestImage(for: photoAsset, targetSize: CGSize(width: 100, height: 100), contentMode: .aspectFill, options: nil) { (image, info) -> Void in } これのimageがUIimageだからこいつを遷移先のビューに渡して 遷移先のビューで イメージビュー.image = image で終わりです
EDM

2020/02/03 07:41

ということはVC2の方は @IBoutlet weak var imageView: UIImageView! var image: UIImage! viewDidLoad()の中に imageView.image = image という感じですかね。 やってみたところ、画像が表示されていないので、送られてきていないということでしょうか
bobmax

2020/02/03 07:44

いいと思いますが。 それはデバッグしてimage変数の中を見てください。
EDM

2020/02/03 08:05

imageがnilの状態ですね。 つまりなにもないと
bobmax

2020/02/03 08:10

ちゃんと渡してますか?
EDM

2020/02/03 08:20

無いってことはちゃんと渡せていないってことですよね。 今VC VC2のコード記述しました。
bobmax

2020/02/03 08:39

このコード最新ですか? imageに対してなにもやってないですよね? 渡せていないっていうか渡そうてしていないですね。
EDM

2020/02/03 08:43

渡そうとしていないとはどういうことですか? 先ほどのmanagerは画像取得したということですよね? それがimageView.image = imageで渡したという事ではないのですか?
bobmax

2020/02/03 08:49

imageManager.requestImage(for: photoAsset, targetSize: CGSize(width: 100, height: 100), contentMode: .aspectFill, options: nil) { (image, info) -> Void in } のimageに画像があるんですよ それを遷移先のビューにわたさないといけないですよね? 当たり前のことですがクラス間で変数は保持されませんから
EDM

2020/02/03 09:08 編集

なるほど。(image, info)のimageにあるのですね。 Void in } imageView.image = image これで右辺image をimageViewに渡す。このimageがimage,infoのimage このような感じでしょうか
EDM

2020/02/03 09:22

Void in } imageView.image = imageだとインスタンスメンバーがVC2では使用できませんというエラーが出ます。 VC2でweak var imageView : UIImageView!。 var image: UIImage() 変数の宣言はしているのですが、VCでも宣言しろということでしょうか?
bobmax

2020/02/03 09:40

あっさきのそういう意味ですね。全く違います。 var alertController: UIAlertController!と同じところに var _image: UIImageこれ宣言して ↓これこうして manager.requestImage(for: asset, targetSize: CGSize(width:100, height:100), contentMode: .aspectFill, options: nil) { (image, info) -> Void in _image = image } サイト参考にして _imageを遷移先のビュー(VC)に渡す これで分からなければもう手に負えません。
EDM

2020/02/03 10:40

理解の疎い私で誠に申し訳ないです。 現在 var nextimage: UIImage! を宣言 Void inのところで self.nextimage = image selfはつけないといけないみたいです。エラー出ました。 これでself.nextimageに渡せました。 VC2で @IBoutlet weak var imageView: UIImageView! を宣言 ViewDidLoadのなかに imageView.image = nextimage これで完璧と思ったのですが nextimageがエラーでたのでVC2でもvar nextimage : UIImage!を宣言 これでもできませんでした。 ためしにprint(self.nextimage)をnextimage.image = imageの下に記述してみると デバックにoptional(<UIImage: 0x283a4c380>)と VC2の方にもimageView.image = nextimageの下にprint(imageView)をしてみると optional(<UIImageView: 0x127ad6a80>)と値は渡せていると思うのです。 ただ、imageViewのprint文が上の後に frame = (-28 44; 375 603); clipsToBounds = yes; autoresize = RM+BM; userInteractionEnabled = no; layer = <CALayer: 0x2811f9520> となっています。フレームはimageViewの大きさなのは理解いているのですが。
bobmax

2020/02/03 12:16

なんか根本的に勘違いしてません?VCのnextimageに値を入れたらVC2のnextimageに値が入ると思ってませんか? VCとVC2はまったく別のクラスなんですよ? もちろんですがVCで宣言したnextimageとVC2でnextimageは名前が一緒なだけで全く別のものですよ? あと値が入っているかどうか確認するべきなのはVC2のnextimageの中ですよね…。 imageViewはただ画像を表示するviewです。imageViewのログからは値が渡せているという判断はできません。単純にストーリボードで配置したimageViewの中身が見えているだけです。
EDM

2020/02/03 12:42 編集

そうなんですね。名前が同じだから入っているものだとばかり. だから値が違うのですね。 では、今現在のimageView.image = self.nextimageはまったく違うものを入れている。何も入っていないものをimageViewに渡していたのですね。 では、imageが渡されたnextimageはどのように渡すのでしょう。 performsegueなので、リンクの1が使えるはずです。indentifier変えました if isSuccses{ self.performSegue(withIdentifier: "toViewController2", sender: nil) } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "toViewController2" { let nextVC = segue.destination as! ViewController2 nextVC.image = self.nextimage } } という感じですか? これだとVC2にimageのメンバがないと
bobmax

2020/02/03 12:44

そんな感じですよ 動かしましたか?
EDM

2020/02/03 12:53 編集

VC2のほうでnextVCとimageをUIImage!で宣言しました。 ただ、先ほどと同じで、同じ名前 だけど違うということですね nextVCは
Zuishin

2020/02/03 12:47

「という感じですか?」と聞く前に自分でやってみれば早いのに。至急なら人を急がせるんじゃなく自分が急がないと。
EDM

2020/02/03 12:49

モニター2面あるので 両方でやっています。
Zuishin

2020/02/03 12:56

ここまで話が通じないのか。
EDM

2020/02/03 12:59

ごめんなさい。至急なので本当に悩んで、いろんなサイト見ながらやっています。それでもわからないので質問しているのです。xcodeで意見を聞いて画像の値の値渡しがうまくいかないので。ほんとうに申し訳なく思っています
bobmax

2020/02/03 13:02

さすがに笑いましたw vc2にnextimage宣言したんじゃないんですか? そこに入れましょう
EDM

2020/02/03 13:09

ごめんなさい。nextViewが別のモノだとわかったので変えています。 コード編集しました。 もう何がいけないのわからないです。
bobmax

2020/02/03 13:14

じゃあなんでもいいので変数追加してください。 VC2のメンバにないって言われてるんだから作りましょう ほんで、そこにimageをいれてあげれば渡せますよね? まぁ落ち着いてください
EDM

2020/02/03 13:21 編集

はい! VC2で var image :UIImage! var nextVC: UIImage! var nextVCimage : UIImage! の3つ宣言しました。
bobmax

2020/02/03 13:28

1つでよいですがその中のどれかを↓で指定してください。 VC2で宣言していれば先ほどのようにエラーは出ないはずです。 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "toViewController2" { let nextVC = segue.destination as! ViewController2 nextVC.image = self.nextimage //ここのnextVC. の後に書く } } そしたらVC2で宣言している変数の中に値が入っているはずです。 それを今まで通りimageViewのimageに代入してください。
EDM

2020/02/03 13:50 編集

やりました!!! VC2で宣言した3つの変数ですが nextVC.image = self.nextimage について VC2でimageとnextVCを宣言しろというエラーだったので宣言してるやつです。 ViewDidLoadのところで nectVCimage = image imageView.image = nextVCimageにしたところ、無事画面に画像が表示されました!! 本当に長い間アドバイスありがとうございました!! この言葉では足りないぐらいお世話になりました。次はあなたのように僕みたいな無知な人を助けられる人になれるよう、もう一度勉強し直します。 本当にありがとうござます!! ちなみに画像の値渡しの時は解像度あらくなるんですか?
bobmax

2020/02/03 13:51

お疲れ様でした(笑 そうですね、1度iOSうんぬんではなくプログラミングを基礎から学び直すことをオススメします。 まだ勉強中だと思いますのでこれにこれに懲りず頑張ってください。
EDM

2020/02/03 13:58

ほんとにその通りです。 プログラミングの基礎からもう一度勉強し直します。 解像度の悪さは仕様ですか?
bobmax

2020/02/03 14:06

manager.requestImage(for: asset, targetSize: CGSize(width: 100, height: 100), contentMode: .aspectFill, options: nil){ ここのtargetSizeとcontentModeを見直してください targetSizeはimageの高さと横幅です これで改善しない場合は色々ありますが今からは長くなるのであきらめましょう(笑
EDM

2020/02/03 14:07

わかりました! 最後までありがとうございました!! 本当にありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問