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

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

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

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

502閲覧

アルバム(カメラロール)で選択した画像をCustomCellに設置したUIImageViewに表示させたい。(xibファイル使用)

Teratopi

総合スコア8

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2020/06/03 13:40

実現したいこと

アルバム(カメラロール)で選択した画像をCustomCellに設置したUIImageViewに表示させたい。

###前提条件

  • UINavigationControllerを継承したViewControllerが1つ。
  • そのViewControllerにUITableViewとUITableViewCellを設置している。
  • UITableViewCellには、UIImageViewを設置している。
  • UITableViewCellのIdentifierは"Cell"です。

イメージ説明
イメージ説明

アルバムで選択した画像をViewController内のUIImageViewに表示させることは出来るのですが
UITableViewCellに設置したUIImageViewに表示することが出来ません。

ViewControllerに設置したUIImageViewには、アルバムで選択した画像を表示させることは出来ています。

1ヶ月ぐらい、この方法について検索してヒットした情報をもとに自分のコードに反映させて実践しましたが
UITableViewCellにアルバムで選択した画像を反映させることは出来ませんでした。

色々検索して思うのは、アルバムの画像をカスタムセルに反映させる方法は大別して2つあるよう思っています。

  1. グローバル変数を使用してCustomCellクラスに画像を受け渡しTableViewをreloadする?
  2. デリゲートメソッドを使用して値を受け渡す?

言い訳ですが基本的なXcodeで使用しているUI Kit等のクラス、メソッドについても理解が追いつかず、
検索してヒットした情報を活かしきることが出来ていないとも思います。
このまま一人で学習していても理解が進まないでの質問させていただきました。

大変恐縮ですが、下記のソースコードに追加または修正で、どのようなコードが必要か教えていただきたいです。

使用している環境

Xcode Ver.11.5
Swift 5

該当のソースコード

swift

1 2import UIKit 3 4class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UIImagePickerControllerDelegate,UINavigationControllerDelegate{ 5 6 7 @IBOutlet weak var album: UIButton! 8 @IBOutlet weak var selectedImage: UIImageView! 9 @IBOutlet weak var MainTable: UITableView! 10 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 MainTable.delegate = self 15 MainTable.dataSource = self 16 MainTable.register (UINib(nibName: "CustomCell",bundle: nil),forCellReuseIdentifier:"Cell") 17 18 } 19 20 // アルバムを起動 21 @IBAction func albumOpen(_ sender: Any) { 22 23 let sourceType:UIImagePickerController.SourceType = 24 UIImagePickerController.SourceType.photoLibrary 25 // アルバムが利用可能かチェック 26 if UIImagePickerController.isSourceTypeAvailable( 27 UIImagePickerController.SourceType.photoLibrary){ 28 // インスタンスの作成 29 let imagePicker = UIImagePickerController() 30 imagePicker.sourceType = sourceType 31 imagePicker.delegate = self 32 self.present(imagePicker, animated: true, completion: nil) 33 } 34 35 else { 36 print("アルバム使用不可") 37 } 38 } 39 40 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 41 42 return 1 43 44 } 45 46 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 47 let cell = MainTable.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomCell 48 49 cell.cellImage.image = //この後をどう書けば良いか分かりません。 50 51 return cell 52 } 53 54 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 55 return 200 56 } 57 58 //画像ピッカーコントローラから画像が選択されるとアクションを処理するメソッド 59 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) { 60 61 if let pickedImage = info[.originalImage] 62 as? UIImage { 63 64 // ViewControllerのUIImageView表示させることは出来ている。 65 selectedImage.image = pickedImage 66 67 } 68 69 picker.dismiss(animated: true, completion: nil) 70 } 71 72 // 撮影がキャンセルされた時に呼ばれる 73 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 74 picker.dismiss(animated: true, completion: nil) 75 print("エラー") 76 } 77 78}

Swift

1import UIKit 2 3class CustomCell: UITableViewCell{ 4 5 @IBOutlet weak var cellImage: UIImageView! 6 7 override func awakeFromNib() { 8 super.awakeFromNib() 9 10 } 11 12 override func setSelected(_ selected: Bool, animated: Bool) { 13 super.setSelected(selected, animated: animated) 14 15 } 16 17}

試したこと

  • データを共有するModelを作成してimagePickerControllerで選択した画像をModelに渡してCustomCellに反映させようとしましたが実現出来ませんでした。

  • デリゲートメソッドの引数を利用して画像を受け渡しCustomCellで表示させようとしましたが実現出来ませんでした。

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

Xcode Ver.11.5
Swift 5.1

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

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

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

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

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

hoshi-takanori

2020/06/03 13:48

UITableView ってことは複数の画像を表示したいのでしょうから、ViewController に画像の配列を用意して、そこからセットすればいいのでは。
Teratopi

2020/06/03 14:32

レスポンスありがとうございます。 UITableView本来の使い方ではないのかもしれませんが、複数の画像を表示したいのではなく、アルバムで任意に選択した画像をCellに表示させたいということなんです。
hoshi-takanori

2020/06/03 14:38

それなら受け取った画像を配列ではない普通のプロパティに格納して tableView.reloadData() して、cellForRowAt でセルに画像をセットするだけです。
guest

回答1

0

ベストアンサー

難しく考えすぎな気がしますが、いちばん簡単な方法としては、こんな感じでしょうか。

diff

1 class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UIImagePickerControllerDelegate,UINavigationControllerDelegate{ 2 3 // 選択された画像を格納するプロパティを追加 (名前は適当…)。 4+ var image: UIImage? 5 6 // 略 7 8 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 9 let cell = MainTable.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomCell 10 11 // 選択された画像をセルに設定。 12+ cell.cellImage.image = self.image 13 14 return cell 15 } 16 17 // 略 18 19 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) { 20 21 if let pickedImage = info[.originalImage] 22 as? UIImage { 23 24 // ViewControllerのUIImageView表示させることは出来ている。 25 selectedImage.image = pickedImage 26 27 // 選択された画像をプロパティに格納して、テーブルビューを更新。 28+ self.image = pickedImage 29+ MainTable.reloadData() 30 } 31 32 picker.dismiss(animated: true, completion: nil) 33 }

投稿2020/06/03 15:11

hoshi-takanori

総合スコア7895

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

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

Teratopi

2020/06/04 02:04

返信が遅くなりすいません。 早急な回答ありがとうございます。 このように書けば良いのですね… 恥ずかしながら、selfの使い方が今ひとつ理解出来てなかったような気がします。 貴重な時間を割いて回答いただき、とても感謝です。 独学で学んでいる私にとって、とても大きな前進になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問