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

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

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

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

Q&A

解決済

2回答

1402閲覧

ボタンにより4枚のImageViewを繰り返し変更する方法

Tomzy

総合スコア104

Swift

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

0グッド

0クリップ

投稿2017/11/27 11:36

###やりたいこと
4枚の画像を準備し、ひとつのボタンのアクション回数に応じて1カ所のImageView上に表示すること

###考えたこと

1番から4番は画像表示にして5番目は画像が表示されない状態にすると考えて、
count += が1⇒2⇒3⇒4⇒5⇒6⇒7⇒・・・と推移しても、
tappedCountは1⇒2⇒3⇒4⇒5⇒1⇒2⇒・・・となるように
(count + 4)/5 の残に1を加えてやる方法を考えました。

しかし、%を使うとエラーになり、('%' is not a postfix unary operator)
truncatingRemainderを使うとinitには使えないとエラーになります。

###現状のコードと結果⇒お願いしたいこと
エラーのでる残を表示するコードはCommentOutして
let tappedCount = count
とするとタップ回数に応じて画像が変更になり表示されますが
6回目のタップからは5回目と同じで画像が表示されません。1回目と同じ画像を表示したいのですが
どのようにコーディングしたらよいかご教示ください。

コード
↓ ↓ ↓

// // タップ回数を加算 count += 1 //let tappedCount = Int((count+4).truncatingRemainder(dividingBy: 5))+1 // let tappedCount = (count+4)/5% + 1 let tappedCount = count // タップ数が1の場合 if (tappedCount == 1 ) { print("記号表示01") Image01.image = KigoImg01 } // 2回目がタップされた場合else else if (tappedCount == 2 ) { Image01.image = KigoImg02 print("記号表示02") } // 3回目がタップされた場合else else if (tappedCount == 3 ) { Image01.image = KigoImg03 print("記号表示03") } // 4回目がタップされた場合else else if (tappedCount == 4 ) { Image01.image = KigoImg04 print("記号表示04") } // 5回目がタップされた場合else else if (tappedCount == 5 ) { Image01.removeFromSuperview() print("記号表示05") } }

###ご参考事項

  • 環境は下記のとおりです。

MacBook Pro (15-inch, 2016)
High Sierra OS10.13
Version 9.1 (9B55)Swift4にバージョンアップしました。

  • 下記のように定義しています。

@IBOutlet weak var InputView: UITextView!
@IBOutlet weak var Kigo01: UIButton!

  • 画面は下記のとおりです。

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

  • その後ボタンの数は1列7個にして列は2列に減らしました。(広告スペースが大きいので)
  • Mailの起動と本文記載は成功しています。

-説明ボタンはこのアプリの使い方(ボタンの解説)を画像で説明します。要領はこの記号の画像と同じです。

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

if

swift

1let tappedCount = count % 5 2if tappedCount == 1 { 3 //image1 4} else if tappedCount == 2 { 5 //image2 6} else if tappedCount == 3 { 7 //image3 8} else if tappedCount == 4 { 9 //image4 10} else { 11 //非表示 12}

switch

swift

1switch count % 5 { 2 case 1: 3 //image1 4 case 2: 5 //image2 6 case 3: 7 //image3 8 case 4: 9 //image4 10 default: 11 //非表示 12}

投稿2017/11/28 02:20

編集2017/11/28 02:23
fuzzball

総合スコア16731

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

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

Tomzy

2017/11/28 02:29

ありがとうございました。 下記できれいに表示されました。 コード  ↓ ↓ ↓ @IBAction func kigo01(_ sender: Any) { // // タップ回数を加算 count += 1 let tappedCount = count % 5 if tappedCount == 1 { //image1 Image01.image = KigoImg01 } else if tappedCount == 2 { //image2 Image01.image = KigoImg02 } else if tappedCount == 3 { //image3 Image01.image = KigoImg03 } else if tappedCount == 4 { //image4 Image01.image = KigoImg04 } else { //非表示 Image01.image = nil } print("記号表示05") }
Tomzy

2017/11/28 02:35

ベストアンサーを切り替える方法がわからないので修正していませんが、とてもすっきりしました。
fuzzball

2017/11/28 02:50 編集

解決した上で、今後の参考に書いたものなので切り替える必要はありません。
fromageblanc

2017/11/28 02:49

余りをそのまま使うほうがシンプルですねw
Tomzy

2017/11/29 03:15

解説ボタンの方はswitchを使い、下記のコードで画像を5枚表示しました。6回目のボタンでは第1画面が表示されました。ありがとうございました。 コード  ↓ ↓ ↓ @IBOutlet weak var Kaisetsu: UIButton! @IBOutlet weak var Image01: UIImageView! var Kaisetsu01 = UIImage(named:"Kaisetsu01")! var Kaisetsu02 = UIImage(named:"Kaisetsu02")! var Kaisetsu03 = UIImage(named:"Kaisetsu03")! var Kaisetsu04 = UIImage(named:"Kaisetsu04")! var Kaisetsu05 = UIImage(named:"Kaisetsu05")! //中略 //解説ボタンを押したときアプリと記号について解説する画像 @IBAction func Kaisetsu(_ sender: Any) { print("解説表示01") // // タップ回数を加算 count += 1 print("解説表示02") switch count % 6 { case 1: Image01.image = Kaisetsu01 print("解説表示03") case 2: Image01.image = Kaisetsu02 case 3: Image01.image = Kaisetsu03 case 4: Image01.image = Kaisetsu04 case 5: Image01.image = Kaisetsu05 default: //非表示 Image01.image = nil print("解説表示04") } }
guest

0

ベストアンサー

これでいいんじゃないでしょうか?
5で割り切れたら5、以外は余りを使う。

Swift

1var tappedCount = (count % 5) == 0 ? 5 : (count % 5)

投稿2017/11/27 11:55

編集2017/11/27 11:58
fromageblanc

総合スコア2724

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

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

Tomzy

2017/11/27 12:43

早速ありがとうございました。 入れてみました。最初はビルドできて1〜4の画像が表示されましたが、6回目以降のタップが有効ではありませんでした。 それにXcodeに戻ったら下記のエラーがでました。 黄色 var tappedCount = (count % 5) == 0 ? 5 : (count % 5)のところに Variable 'tappedCount' was never mutated; consider changing to 'let' constant 赤 Image01.image = KigoImg01のところに Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
Tomzy

2017/11/27 12:46

ログは下記のとおりです 2017-11-27 21:44:47.116659+0900 VoiceAsisst01Free[11521:3918938] [DYMTLInitPlatform] platform initialization successful 2017-11-27 21:44:47.332044+0900 VoiceAsisst01Free[11521:3918871] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles 2017-11-27 21:44:47.333041+0900 VoiceAsisst01Free[11521:3918871] [MC] Reading from public effective user settings. 2017-11-27 21:44:47.405785+0900 VoiceAsisst01Free[11521:3918871] [MC] Lazy loading NSBundle MobileCoreServices.framework 2017-11-27 21:44:47.407807+0900 VoiceAsisst01Free[11521:3918871] [MC] Loaded MobileCoreServices.framework 2017-11-27 21:44:47.414401+0900 VoiceAsisst01Free[11521:3918871] Failed to set (keyPath) user defined inspected property on (UIButton): [<UIButton 0x10dd38a60> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key keyPath. ここまで来た15a ここまで来た15b ここまで来た02 ここまで来た02bbb 2017-11-27 21:44:47.553121+0900 VoiceAsisst01Free[11521:3918871] refreshPreferences: HangTracerEnabled: 0 2017-11-27 21:44:47.553167+0900 VoiceAsisst01Free[11521:3918871] refreshPreferences: HangTracerDuration: 500 2017-11-27 21:44:47.553182+0900 VoiceAsisst01Free[11521:3918871] refreshPreferences: ActivationLoggingEnabled: 0 ActivationLoggingTaskedOffByDA:0 ここまで来た01 記号表示01 記号表示02 記号表示03 記号表示04 記号表示05 記号表示01
fromageblanc

2017/11/27 15:04

修正後のソース全部見せてください。 let tappedCount = count の行が生きてませんか?
Tomzy

2017/11/27 22:10

コードは下記のとおりです。 実機でもシミュレーターでも同じ症状です。 よろしくお願いします。 @IBAction func kigo01(_ sender: Any) { // // タップ回数を加算 count += 1 var tappedCount = (count % 5) == 0 ? 5 : (count % 5) //let tappedCount = count // タップ数が1の場合 if (tappedCount == 1 ) { print("記号表示01") Image01.image = KigoImg01 } // 2回目がタップされた場合else else if (tappedCount == 2 ) { Image01.image = KigoImg02 print("記号表示02") } // 3回目がタップされた場合else else if (tappedCount == 3 ) { Image01.image = KigoImg03 print("記号表示03") } // 4回目がタップされた場合else else if (tappedCount == 4 ) { Image01.image = KigoImg04 print("記号表示04") } // 5回目がタップされた場合else else if (tappedCount == 5 ) { Image01.removeFromSuperview() print("記号表示05") } }
Tomzy

2017/11/27 22:12

追加説明です。 var tappedCount = (count % 5) == 0 ? 5 : (count % 5) 部分はコピーペーストではなく、新規に打ち込みました。
fromageblanc

2017/11/27 22:24

ログ見るとtapCountは意図している挙動してますよね。 5回目のremoveFromSuperviewがコケる原因じゃないのですか? varはletに変更すれば黄色いメッセージが消えます。
Tomzy

2017/11/28 01:13

ありがとうございました。 var ⇒ let にしましたらエラーは消えました。 Image01.removeFromSuperview() をCommentOutしましたら、4枚目の画像から1番目の画像になり、以後繰り返しになりました。 という次第で本件解決しました。5回目のボタンの場合の表示については別途対策を検討します。ありがとうございました。
fuzzball

2017/11/28 01:40 編集

ちょっとややこしいことになっているようなのでお邪魔します。 let tappedCount = count % 5 にして、非表示判定は == 5 ではなく == 0 にすれば、よりシンプルになるかと。 ついでに、非表示は Image01.image = nil でいけませんかね?
Tomzy

2017/11/28 02:18

助かりました。下記のとおり変更したら狙ったとおりの表示になりました。 Image01.removeFromSuperview()  ↓ ↓ ↓ Image01.image = nil 「let tappedCount = count % 5 にして、非表示判定は == 5 ではなく == 0 にすれば、よりシンプルになるかと。」については勉強させて頂きます。
fuzzball

2017/11/28 02:21

回答として書きましたので参考にして下さい。
Tomzy

2017/11/28 02:33

ありがとうございました。 きれいに表示されました。私はif文が好きなので回答のコメント欄にコードを書きました。
fuzzball

2017/11/28 02:41

好きならしょうがないですねw
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問