医大生Appyのブログ

初めまして、医大生のAppyです。サッカー、ドラム、オセロ、プログラミング、数学、医学、アニメ、ゲーム、漫画etc...と多趣味な医大生です。それをうまく利用して有益な情報をみなさんにお届けできればと思い、ブログを始めました。ゆっくりしていってね。

UIbuttonの画像を設定・変更するのに行き詰まった。(action 状態になってるボタンの画像をコードで変える方法)

まず、結論から。

action と outlet は一つのボタンで併存できます。

つまり、あるボタンをドラッグ&ドロップで配置してそこからコードに繋げる際、

action状態にしたあとで、同じボタンを再度別の場所のコードに繋いで、outletにして画像変更してよいのです。

というか、IBActionで定義したボタンをコードで画像変更するのは無理です。

ではどうするのか。

「UIbutton 画像変更 Swift」のように検索すると、どのサイトも
____________________________
class ViewController: UIViewController {
@IBOutlet weak var imageButton: UIButton!

@IBAction func imageButtonPush(_ sender: Any) {

let image = UIImage(named: "icon")
let state = UIControl.State.normal

imageButton.setImage(image, for: state)

}
}
____________________________
のように、IBOutletの状態にしているサイトしかなく、たとえば上記の
IBActionの状態にしたボタンをコードによって画像変更する方法が書いてありません。
(ただ画像変更するだけならassetに取り込んだ画像をXcodeの右端の"Image"欄から選べば良いだけですが、普通は何らかの操作を加えて画像を変更したいと思います。)

色々試した結果、
1. Action状態にしたボタン(これをAとします)の画像をコードで変更するには、AをIBOutletとして同じコードの別の行に繋がないといけない。(分かりにくいと思いますので、少し説明をこの後加えます。)
IBActionはどのような操作をするかの記述、IBOutletは見た目に関する記述をしたいときに設定するものと思っていただいて良いと思います)

2. outletで 定義したボタンの見た目を"hoge.png"にしたいときは

@IBOutlet weak var nya1: UIButton!
//nya1という名前でAを、Outletの状態でコードにつなげました。

let gazou1 = UIImage(named: "hoge")
//hogeの後の.pngは省略できます。またUIImageにgazou1と名前をつけました。

override func viewDidLoad() {

super.viewDidLoad()

nya1.setImage(gazou1, for: .normal)
//override func viewDidLoad()など、func~の中でやるとうまくいきます。
}

と書けば、変更できます。
ただし、再度注意しますが、このnya1と定義されたUIButtonは
私のコードでは、別の場所で、IBActionとして定義されているものです。

@IBAction func number1(_ sender: Any) {

}

「number1,nya1は名前は違うけど同じボタン!!
number1はIBAction、nya1はIBOutletにしたときの名前!!」

「number1」とIBActionで定義したからといって、IBOutletで定義した場合と同じように

number1.setImage(gazou1, for: .normal)

と記載してもうまくいかず、エラーが出るだけです。

IBActionで定義した後、同じボタンを

IBOutletでもnya1などと定義した後に、

nya1.setImage(gazou1, for: .normal)

と記載してください。

あなたのSwift生活が、うまくいきますように。