前提・実現したいこと
セルの画面を選択して、画面遷移をしようとしています。同時に、選択したセルの画像を受け渡しを行いたいです。
・今できていること
・セルを作り、画像は表示されている。
・セルをタップした際に、画面遷移自体はsegueを付けてできている。
発生している問題・エラーメッセージ
画面遷移はするが、選択したセル(画像)が何も表示されない。
(問題は、セルをタップした時のアクションの記述のところだろうと一応見当をつけています。)
該当のソースコード
遷移元
swift
1import UIKit 2 3class ViewController: UIViewController,UICollectionViewDataSource { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 } 8 9 10 11 @IBAction func backToTop(segue: UIStoryboardSegue) {} 12 13 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 14 return 30 15 } 16 17 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 18 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "testcell", for: indexPath) as! MyCollectionViewCell 19 // セルのインデックスを取得 20 let columnIndex = indexPath.row 21 // 画像名を作成 22 let imageName = "image" + String(columnIndex + 1) 23 // MyCollectionViewCellのimageに画像を設定 24 cell.cellimage.image = UIImage(named: imageName) 25 26return cell 27 28 } 29 var selectedImage: UIImage? 30 31 func collectionView(_ collectionView: UICollectionView, 32 didSelectItemAt indexPath: IndexPath) { 33 34 35 let columnIndex = indexPath.row 36 let imageName = "image" + String(columnIndex + 1) 37 selectedImage = UIImage(named:imageName) 38 if selectedImage != nil { 39 // SubViewController へ遷移するために Segue を呼び出す 40 performSegue(withIdentifier: "toDetailViewController",sender: nil) 41 } 42 } 43 // Segue 準備 44 override func prepare(for segue: UIStoryboardSegue, sender: Any!) { 45 if (segue.identifier == "toDetailViewController") { 46 let subVC: DetailViewController = (segue.destination as? DetailViewController)! 47 // SubViewController のselectedImgに選択された画像を設定する 48 subVC.testImage = selectedImage 49 } 50 } 51 52 53 54 override func didReceiveMemoryWarning() { 55 super.didReceiveMemoryWarning() 56 } 57 58 59 60}
遷移先
swift
1import UIKit 2 3class DetailViewController: UIViewController { 4 5 6 @IBOutlet weak var recievesideview: UIImageView! 7var testImage:UIImage! 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 recievesideview.image=testImage 11 } 12 13 override func didReceiveMemoryWarning() { 14 super.didReceiveMemoryWarning() 15 // Dispose of any resources that can be recreated. 16 } 17 18 19 /* 20 // MARK: - Navigation 21 22 // In a storyboard-based application, you will often want to do a little preparation before navigation 23 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 24 // Get the new view controller using segue.destinationViewController. 25 // Pass the selected object to the new view controller. 26 } 27 */ 28 29}
試したこと
補足情報(FW/ツールのバージョンなど)
始めたばかりで質問自体も的確でないかもしれないので、もし回答するにあたって必要な情報があればすぐに追記します。
全体的に理にかなったコードだと思いました。なのでどちらかというとDetailViewControllerのrecievesideview周りの気がします。 override func viewDidLoad() { super.viewDidLoad() recievesideview.image=testImage } ここにたとえば前から引き継いだtestImageではなく let imageName = "image" + "1" // recievesideview.image = UIImage(named: imageName) 等でハードコードして正しく画像は表示されますかね?
コードをおっしゃる通りに編集しました。画像が表示されました! ひとまず、ありがとうございます。
しかし、もう1つだけ課題が残っています。現在、どのセルをクリックしても同じ画像が出てきている状況です。(おそらく、「"image" + "1"」の部分かと思います。ややこしくて申し訳ありませんが、「image1」という画像名をAssetとして保存しているためです。)
すみません、言葉足らずでしたね。私のお願いしたコードでは全て同じ画像が表示される状態で正しいです。 表示の問題なのか、画像の受け渡しの問題なのかの切り分けのためでした。 この切り分けでDetailViewControllerに問題がないのはわかりましたので、DetailViewControllerのコードは元の状態に戻してください。
こちらこそ、失礼しました。元の状態に戻しておきます。私の方でも引き続き、「画像の受け渡し」の周辺をもう一度確かめてみます。
回答1件
あなたの回答
tips
プレビュー