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

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

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

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

button

HTMLで用いる<button>タグです。

Xcode

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

Swift

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

Q&A

解決済

1回答

832閲覧

XCode、Swift:ButtonとPickerViewの選択に合わせて画像を表示したい

yohoho

総合スコア2

iOS

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

button

HTMLで用いる<button>タグです。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/05/20 07:57

編集2021/05/20 12:40

前提・実現したいこと

XCode、Swiftの質問です。Storyboardを使っています。

ButtonとPickerViewの選択に合わせた画像を表示したいです。

Buttonを3つ【イルカ】【犬】【猫】を設置し、PickerViewを1つ:データリスト【【青、赤、黄色】、【丸、四角】】を設置しました。
Buttonで最後に押された項目(例えば:イルカ)とPickerViewの1つ目のコンポーネントで選択されたデータ(例えば:青)を組み合わせた画像(例えば:青いイルカ)を表示するアプリを作成したいです。

用意している画像(と画像名、すべてpng file)は次の9つです。
青いイルカ(iruka-1)、青い犬(inu-1)、青い猫(neko-1)、
赤いイルカ(iruka-2)、赤い犬(inu-2)、赤い猫(neko-2)、
黄色いイルカ(iruka-3)、黄色い犬(inu-3)、黄色い猫(neko-3)

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

Buttonを押したときに画像が表示されますが、PickerViewで選択が起こったときには表示されません。
PickerViewで選択した際にも該当の画像が表示されるようにしたいです。

該当のソースコード

Swift

1import UIKit 2 3 4class ViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource { 5 //Storyboardとの設定・紐付け 6 7 @IBOutlet weak var ImageView: UIImageView! 8 9 @IBOutlet var pickerview: UIPickerView! 10 11 @IBOutlet var Button01: UIButton! 12 @IBOutlet var Button02: UIButton! 13 @IBOutlet var Button03: UIButton! 14 15 //imageList(画像名の割当) 16 let imageList = [["1","2","3"],["maru","shikaku"]] 17 18 override func viewDidLoad() { 19 super.viewDidLoad() 20 // Do any additional setup after loading the view. 21 } 22 //UIPickerViewの列の数を返す 23 func numberOfComponents(in pickerView: UIPickerView) -> Int { 24 return imageList.count 25 } 26 27 //UIPickerViewの行数、リストの数を返す 28 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{ 29 return imageList[component].count 30 } 31 32 //UIPickerViewの画面での表示を指定する 33 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?{ 34 return imageList[component][row] 35 } 36 37 //画像を表示するfunc 38 func view_image(file_image: String){ 39 let file_image2 = "(imageList[pickerview.selectedRow(inComponent:0)]).png" 40 ImageView.image = UIImage(named: "(file_image)(file_image2)") 41 } 42 43 //Buttonが押されたときのAction 44 45 @IBAction func tapButton01(_ sender: Any){ 46 let file_image = "iruka-" 47 view_image(file_image: file_image) 48 } 49 @IBAction func tapButton02(_ sender: Any){ 50 let file_image = "inu-" 51 view_image(file_image: file_image) 52 } 53 54 @IBAction func tapButton03(_ sender: Any) { 55 let file_image = "neko-" 56 view_image(file_image: file_image) 57 } 58 59 //UIPickerViewが選択されたときの動作 60 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int){ 61 62 view_image(file_image: file_image) 63 } 64 65 66 67 override func didReceiveMemoryWarning() { 68 super.viewDidLoad() 69 } 70 71 72} 73

試したこと

pickerView内に引数を受け渡すことができない+Buttonで設定したfile_imageを@IBAction外で引き継げないという2つの問題がありそうです。

補足情報

Storyboard(UIkit)を使っています。
よろしくお願いいたします。

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

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

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

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

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

tomato879241

2021/05/20 10:20

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) のdelegate methodの使い方が間違っています。そのdelegate methodではそれぞれのcomponentの選択されたものが返ります。 pickerView.selectedRow(inComponent: 0) は最初のcomponentで選択されたindexが返るので、imageList[pickerView.selectedRow(inComponent: 0)]が選択されたarrayの要素になります。
yohoho

2021/05/20 12:42

ご指摘ありがとうございます。事情により元コードを載せることが出来ず、簡略化させて書こうとしたら色々と間違えていました。修正いたしましたので、よろしくお願いいたします。
hoshi-takanori

2021/05/20 22:17 編集

file_image を ViewController のプロパティにすれば良いのでは…。 あと、let file_image2 = imageList[0][pickerview.selectedRow(inComponent: 0)] のような。
yohoho

2021/05/20 22:54

ありがとうございます。 >>file_imageをViewControllerのプロパティにすれば良いのでは すみません、こちら具体的にどういう意味かご教示いただけますと幸いです… >>let file_image2 = imageList[0][pickerview.selectedRow(inComponent: 0)] のような。 おっしゃる通りです。ご指摘ありがとうございます。
guest

回答1

0

ベストアンサー

とりあえずこんな感じでいかがでしょうか。

diff

1 class ViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource { 2 // 略 3 4+ var file_image = "iruka-" // file_image を ViewController のプロパティにする 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 // Do any additional setup after loading the view. 9 10+ view_image() // 最初に画像を表示したかったらここで。 11 } 12 13 // 略 14 15 //画像を表示するfunc 16- func view_image(file_image: String){ 17- let file_image2 = "(imageList[pickerview.selectedRow(inComponent:0)]).png" 18+ func view_image() { // file_image をプロパティにしたので、引数は不要。 19+ let file_image2 = imageList[0][pickerview.selectedRow(inComponent: 0)] 20 ImageView.image = UIImage(named: "(file_image)(file_image2)") 21 } 22 23 //Buttonが押されたときのAction 24 25 @IBAction func tapButton01(_ sender: Any){ 26- let file_image = "iruka-" 27- view_image(file_image: file_image) 28+ file_image = "iruka-" // ローカル変数ではなくプロパティを更新。 29+ view_image() 30 } 31 32 // 略 (tapButton02, tapButton03 も tapButton01 と同様) 33 34 //UIPickerViewが選択されたときの動作 35 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int){ 36 37- view_image(file_image: file_image) 38+ view_image() 39 }

投稿2021/05/20 23:31

hoshi-takanori

総合スコア7901

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

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

yohoho

2021/05/21 00:18

ありがとうございます!!できました!! 本当に助かりました。 ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問