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

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

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

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

3388閲覧

【Swift】ボタンを複数個生成・押したボタンに応じて画像を変更する方法は?

ababab

総合スコア47

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2016/10/09 12:48

Swift3.0で、for文でUIButtonを複数個生成・押したボタンのタグに応じて画像を変更する方法が分かりません。

Objective-Cの場合、UIButtonを複数個生成した後

objective

1btn[1].image = image1;

のように、ボタン名[index]で指定することにより各ボタンの画像を設定する事ができますが、
Swiftでも同様の事ができるのでしょうか?

現在のコードはこちらになります。

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5private var Selectbtn: [UIButton]! 6var SelectbtnImage: UIImage! 7 8override func viewDidLoad() { 9 super.viewDidLoad() 10 11 self.view.backgroundColor = UIColor.white 12 13 for i in (0 ..< 4) { 14 15 let Selectbtn = UIButton() 16 Selectbtn.frame = CGRect(x: 25+(i*60) + (i*10),y: 370,width: 60,height: 60) 17 SelectbtnImage = UIImage(named: "\(i+1)_a.png")! 18 Selectbtn.setBackgroundImage(SelectbtnImage, for: UIControlState()) 19 Selectbtn.tag = i+1 20 Selectbtn.addTarget(self, action: #selector(ViewController.changeImage(_:)), for: .touchUpInside) 21 self.view.addSubview(Selectbtn) 22 23 } 24} 25 26func changeImage(){ 27 28 for i in (0 ..< 4) { 29 30 if clothFlg == true { 31 32 Selectbtn.setBackgroundImage(UIImage(named:"\(i+1)_a.png"), for: UIControlState()) 33 34 }else{ 35 36 Selectbtn.setBackgroundImage(UIImage(named:"\(i+1)_b.png"), for: UIControlState()) 37 38 } 39 } 40} 41

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

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

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

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

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

guest

回答1

0

ベストアンサー

このスクリプトを見る限り、func changeImageの中でfor文を回す必要はないと思います。
タグを設定したのであれば、
if clothFlg == true {
Selectbtn.setBackgroundImage(UIImage(named:"(i+1)_a.png"), for: UIControlState())
}else{
Selectbtn.setBackgroundImage(UIImage(named:"(i+1)_b.png"), for: UIControlState())
}
この部分でiではなくtagで場合分けしてUIImageの指定をすればいいのではないかと思います。

投稿2016/10/10 06:32

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ababab

2016/10/10 10:37

回答ありがとうございます。ただ自分のやりたいことは、それぞれ違うtagのついたSelectbtnが複数個あり、例えばtagが4のSelectbtnにはa.png、それ以外のSelectbtnにはb.pngを反映するというものです。こちらは可能なのでしょうか?
退会済みユーザー

退会済みユーザー

2016/10/10 11:36 編集

タグを設定しているのであれば、それを使って場合分けをするなどして下さい。 Selectbtn.addTarget(self, action: #selector(ViewController.changeImage(sender:)), for: .touchUpInside) これで、関数に引数を入れられます。 次に、タグによって場合分けをします。 func changeImage(sender:UIButton){ if sender.tag == 4{ sender.setBackgroundImage(UIImage(named:"a.png"), for: UIControlState()) }else{ sender.setBackgroundImage(UIImage(named:"b.png"), for: UIControlState()) } } このようにすると、sender.tagで押されたボタンのタグによって処理を分けることができます。
ababab

2016/10/10 11:31

回答ありがとうございます。この方法だと、tagが4のSelectbtnを押した時に全てのSelectbtnがa.pngになってしまうのですが...
退会済みユーザー

退会済みユーザー

2016/10/10 11:35

あ、すみません、ミスです。 sender.setBackgroundImage(UIImage(named:"a.png"), for: UIControlState()) に書き換えて下さい。 これで押されたボタンだけにアクセスすることができます。
退会済みユーザー

退会済みユーザー

2016/10/10 11:37 編集

それと、補足ですが、 if clothFlg == trueなんて書き方はSwiftではあまり見ないので、 if clothFlg{ } の方がいいと思います。
ababab

2016/10/10 12:25

ありがとうございます。反対に、押されたボタン以外のボタンの画像をまとめて変更する場合はどう書けば良いでしょうか?
退会済みユーザー

退会済みユーザー

2016/10/10 22:05

押されたボタン以外のものにアクセスするには、一番最初に投稿されたようにボタンの配列作っておきます。しかし、あのままではボタンを配列に入れた意味がありません。for文のところでは、タグではなく、iで場合分けをします。 <for文内> if i == 4{ }else{ } こうすれば、タグも引数も指定する必要はありませんね。一つ気をつけなければいけないのは、最初のボタンは0なので4番目をしていする時はif i == 3になりますね。
ababab

2016/10/11 10:30

つまり、一番最初のコードでいう「changeImage」内の「if clothFlg == true {」の部分を「if i = 4」のように変更すれば良いということでしょうか?どのボタンを押した時も「changeImage」は実行されますが、押したボタンだけa.pngに、それ以外のボタンをb.pngに変更したいのですが...
ababab

2016/10/11 10:52

大変失礼致しました。for文内に、 UIButton()で初期化しつつif文で分岐を書けば大丈夫でした。重ねての質問にお答え頂き、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問