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

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

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

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

Swift

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

Q&A

解決済

1回答

789閲覧

Swiftで画像の切り替え表示を保存したままの状態にしたいです。

bulpon

総合スコア16

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/02/11 15:21

###【Swift】画像の切り替え表示について

swiftで簡単な英単語暗記アプリを作っています。

NEXTボタンをタップすると、その都度上に「英単語と日本語訳」が書かれた画像がランダムに表示されるシステムになっています。

ここから覚えていなかった単語が出てきた場合、覚えてないボタンを押すと
単語を赤くマークする=文字を赤くした別の画像に切り替わるようにしたいです

イメージ説明

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

以下のようなコードで書いたところ、覚えていないボタンを押したら一時的に画像が赤い文字のものに切り替わりますが、次の英単語に進んでいくと同じ単語が出ても、元の文字が赤くない画像に戻ってしまいます。 1度覚えていないボタンを押した画像が、ずっと文字が赤い画像 (「宇宙2」など)に切り替わる(その動作が保存される)にはどのように修正すれば良いのでしょうか。 【例】 「宇宙」画像を覚えていない場合、その後は「宇宙2」画像に変更したままにしたいです。

該当のソースコード

@IBOutlet weak var eitangoView: UIImageView! var eitangoNumber = 0 @IBAction func ShuffleAction(_ sender: Any) { var neweitangoNumber = 0 repeat { neweitangoNumber = Int(arc4random_uniform(9)) } while eitangoNumber == neweitangoNumber eitangoNumber = neweitangoNumber if eitangoNumber == 0 { eitangoView.image = UIImage(named:"宇宙") }else if eitangoNumber == 1{ eitangoView.image = UIImage(named:"海外へ") }else if eitangoNumber == 2{ eitangoView.image = UIImage(named:"工業") }else if eitangoNumber == 3{ eitangoView.image = UIImage(named:"事故") }else if eitangoNumber == 4{ eitangoView.image = UIImage(named:"多分") }else if eitangoNumber == 5{ eitangoView.image = UIImage(named:"動き") }else if eitangoNumber == 6{ eitangoView.image = UIImage(named:"突然") }else if eitangoNumber == 7{ eitangoView.image = UIImage(named:"宝物") }else if eitangoNumber == 8{ eitangoView.image = UIImage(named:"隣人") } } @IBAction funk oboetenaiAction(_ sender: Any) { if eitangoNumber == 0 { eitangoView.image = UIImage(named:"宇宙2") }else if eitangoNumber == 1{ eitangoView.image = UIImage(named:"海外へ2") }else if eitangoNumber == 2{ eitangoView.image = UIImage(named:"工業2") }else if eitangoNumber == 3{ eitangoView.image = UIImage(named:"事故2") }else if eitangoNumber == 4{ eitangoView.image = UIImage(named:"多分2") }else if eitangoNumber == 5{ eitangoView.image = UIImage(named:"動き2") }else if eitangoNumber == 6{ eitangoView.image = UIImage(named:"突然2") }else if eitangoNumber == 7{ eitangoView.image = UIImage(named:"宝物2") }else if eitangoNumber == 8{ eitangoView.image = UIImage(named:"隣人2") } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

それぞれの単語について、覚えてないかどうかを保存する変数が必要です。
例えば、最初の単語 universe を覚えてない場合の処理について説明します。

まず、eitangoNumber の下に oboetenaiFlag0 を追加して、最初は false にしておき、覚えてない場合には true に変更することにします。

swift

1 var eitangoNumber = 0 2 3 // "宇宙" を覚えてない場合は true にする 4 var oboetenaiFlag0 = false

ShuffleAction の変更は後にして、先に oboetenaiAction を変更しましょう。
覚えてないボタンが押された場合には oboetenaiFlag0 を true に変更する処理を追加します。

swift

1 @IBAction funk oboetenaiAction(_ sender: Any) { 2 if eitangoNumber == 0 { 3 eitangoView.image = UIImage(named:"宇宙2") 4 5 // "宇宙" を覚えてないので true に変更する 6 oboetenaiFlag0 = true 7 8 }else if eitangoNumber == 1{ 9 eitangoView.image = UIImage(named:"海外へ2") 10 11 // 以下略 12 13 }

最後に、ShuffleAction の変更ですね。oboetenaiFlag0 を使って表示を変更します。
ちなみに、if oboetenaiFlag0 {if oboetenaiFlag0 == true { と同じ意味です。

swift

1 @IBAction func ShuffleAction(_ sender: Any) { 2 3 var neweitangoNumber = 0 4 5 repeat { 6 7 neweitangoNumber = Int(arc4random_uniform(9)) 8 9 } while eitangoNumber == neweitangoNumber 10 11 eitangoNumber = neweitangoNumber 12 13 14 if eitangoNumber == 0 { 15 16 // oboetenaiFlag0 が true の場合は赤で、そうでない場合は普通に表示する。 17 if oboetenaiFlag0 { 18 eitangoView.image = UIImage(named:"宇宙2") 19 } else { 20 eitangoView.image = UIImage(named:"宇宙") 21 } 22 23 }else if eitangoNumber == 1{ 24 eitangoView.image = UIImage(named:"海外へ") 25 26 // 以下略 27 28 }

こんな感じで oboetenaiFlag1 〜 oboetenaiFlag8 を作って書き直せば、たぶんお望みの動作になると思います。


とはいえ、このように

swift

1 var oboetenaiFlag0 = false 2 var oboetenaiFlag1 = false 3 var oboetenaiFlag2 = false 4 var oboetenaiFlag3 = false 5 var oboetenaiFlag4 = false 6 var oboetenaiFlag5 = false 7 var oboetenaiFlag6 = false 8 var oboetenaiFlag7 = false 9 var oboetenaiFlag8 = false

同じような名前の変数をたくさん作って、ShuffleAction や oboetenaiAction 同じような処理を書くのは大変ですよね。コピペして修正してると、間違えて "宇宙" を覚えてないはずが "海外へ" を覚えてないことになってたりするし…。
という場合に便利なのが「配列」なので、ぜひ勉強して使えるようになってください。

また、「universe」「ユニヴァース」「宇宙」を一つの画像として表示しているようですが、一つ一つ画像を作るのは大変だと思いますので、それぞれ UILabel を使って文字列で表示することを検討してもいいと思います。


ちなみに、配列を使って書き直すとこんな感じになると思います。

swift

1class AnkiViewController: UIViewController { 2 3 // 略 4 5 @IBOutlet weak var eitangoView: UIImageView! 6 7 var eitangoNumber = 0 8 9 //英単語データ 10 let eitangoImages = ["宇宙", "海外へ", "工業", "事故", "多分", "動き", "突然", "宝物", "隣人"]; 11 12 //番号の単語を覚えていない場合はtrueにする 13 var shikakuFlags = [false, false, false, false, false, false, false, false, false] 14 15 @IBAction func ShuffleAction(_ sender: Any) { 16 var neweitangoNumber = 0 17 repeat { 18 neweitangoNumber = Int(arc4random_uniform(9)) 19 } while eitangoNumber == neweitangoNumber 20 21 eitangoNumber = neweitangoNumber 22 23 if shikakuFlags[eitangoNumber] { 24 eitangoView.image = UIImage(named: eitangoImages[eitangoNumber] + "2") 25 } else { 26 eitangoView.image = UIImage(named: eitangoImages[eitangoNumber]) 27 } 28 } 29 30 @IBAction func shikakuAction(_ sender: Any) { 31 eitangoView.image = UIImage(named: eitangoImages[eitangoNumber] + "2") 32 shikakuFlags[eitangoNumber] = true 33 } 34}

投稿2020/02/12 01:06

編集2020/02/17 22:12
hoshi-takanori

総合スコア7901

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

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

bulpon

2020/02/12 07:39

丁寧な説明ありがとうございます! 無事うまくいきました。もう少し自分でも勉強したいと思います!
bulpon

2020/02/16 14:22

すみません、、、以前はうまくいったのですがこのようなコードにした結果、シャッフルボタンを押していくと、画像のところにたまに空白が出てきてしまいます。 どのように改善すべきでしょうか、、、 本当に何度もすみません import UIKit class AnkiViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. } */ @IBOutlet weak var eitangoView: UIImageView! var eitangoNumber = 0 //番号の単語を覚えていない場合はtrueにする var shikakuFlag0 = false var shikakuFlag1 = false var shikakuFlag2 = false var shikakuFlag3 = false var shikakuFlag4 = false var shikakuFlag5 = false var shikakuFlag6 = false var shikakuFlag7 = false var shikakuFlag8 = false @IBAction func ShuffleAction(_ sender: Any) { var neweitangoNumber = 0 repeat{ neweitangoNumber = Int(arc4random_uniform(9)) } while eitangoNumber == neweitangoNumber eitangoNumber = neweitangoNumber if eitangoNumber == 0{ eitangoView.image = UIImage(named: "宇宙") //shikakuFlag0 がtrue その場合は視覚調整、そうでない場合は普通に表示する。 if shikakuFlag0{eitangoView.image = UIImage(named: "宇宙2") }else{ eitangoView.image = UIImage(named: "宇宙") } } else if eitangoNumber == 1{ eitangoView.image = UIImage(named: "海外へ") if shikakuFlag1{eitangoView.image = UIImage(named: "海外へ2") }else{ eitangoView.image = UIImage(named: "海外へ") } } else if eitangoNumber == 2{ eitangoView.image = UIImage(named: "工業") if shikakuFlag2{eitangoView.image = UIImage(named: "工業2") }else{ eitangoView.image = UIImage(named: "工業") } } else if eitangoNumber == 3{ eitangoView.image = UIImage(named: "事故") if shikakuFlag3{eitangoView.image = UIImage(named: "事故2") }else{ eitangoView.image = UIImage(named: "事故") } } else if eitangoNumber == 4{ eitangoView.image = UIImage(named: "多分") if shikakuFlag4{eitangoView.image = UIImage(named: "多分2") }else{ eitangoView.image = UIImage(named: "多分") } } else if eitangoNumber == 5{ eitangoView.image = UIImage(named: "動き") if shikakuFlag5{eitangoView.image = UIImage(named: "動き2") }else{ eitangoView.image = UIImage(named: "動き") } } else if eitangoNumber == 6{ eitangoView.image = UIImage(named: "突然") if shikakuFlag6{eitangoView.image = UIImage(named: "突然2") }else{ eitangoView.image = UIImage(named: "突然") } } else if eitangoNumber == 7{ eitangoView.image = UIImage(named: "宝物") if shikakuFlag7{eitangoView.image = UIImage(named: "宝物2") }else{ eitangoView.image = UIImage(named: "宝物") } } else if eitangoNumber == 8{ eitangoView.image = UIImage(named: "隣人") if shikakuFlag8{eitangoView.image = UIImage(named: "隣人2") }else{ eitangoView.image = UIImage(named: "隣人") } } } @IBAction func shikakuAction(_ sender: Any) { if eitangoNumber == 0{ eitangoView.image = UIImage(named: "宇宙2") //宇宙を覚えていないので true に変更する shikakuFlag0 = true }else if eitangoNumber == 1{ eitangoView.image = UIImage(named: "海外へ2") shikakuFlag1 = true }else if eitangoNumber == 2{ eitangoView.image = UIImage(named: "工業2") shikakuFlag2 = true }else if eitangoNumber == 3{ eitangoView.image = UIImage(named: "事故2") shikakuFlag3 = true }else if eitangoNumber == 4{ eitangoView.image = UIImage(named: "多分2") shikakuFlag4 = true }else if eitangoNumber == 5{ eitangoView.image = UIImage(named: "動き2") shikakuFlag5 = true }else if eitangoNumber == 6{ eitangoView.image = UIImage(named: "突然2") shikakuFlag6 = true }else if eitangoNumber == 7{ eitangoView.image = UIImage(named: "宝物2") shikakuFlag7 = true }else if eitangoNumber == 8{ eitangoView.image = UIImage(named: "隣人2") shikakuFlag8 = true } } }
hoshi-takanori

2020/02/17 22:00

画像の名前の「2」が、元のコードではすべて全角だったのが、新しく書き換えた部分では半角になってしまっている部分がありますね。
bulpon

2020/02/18 13:48

ありがとうございます、、????成功じしました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問