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

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

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

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

Q&A

1回答

266閲覧

複数のボタンをひとつのIBActionにつなげる方法 その3 (同じボタンがタップされた場合を見分ける方法)

Tomzy

総合スコア104

Swift

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

0グッド

0クリップ

投稿2018/11/16 08:06

問題の概要

fuzzballさんとtyobigorouさんの助言で複数のボタンをひとつのIBActionにつなげる方法は解決しましたがその手法を使って次の課題に対応しました。

カギのボタンをタップしてtextFieldに記入済みの時間をキーボードを下げて保存し、カギイメージを解錠からロックに切り替える機能を持たせました。更にボタンをタップするとアラートが出てOKをタップするとtextFieldは空になり、キーボードがせり上がり記入できるようになり、カギイメージは解錠状態になる機能を実装しました。カギボタンは14個あります。

最初のボタンの場合は仕込んだとおりの機能を示しますが、2番目のボタンの場合は、アラートが出る状況から始まります。1番のボタンをスキップして2番目・・・14番目のボタンから始めると狙った機能どおり作動します。
下記のスクリーンショット画面で示すとおりです。

原因としては下記のコードのcount = count + 1が最初のボタンを続けてタップする場合と最初のボタン→2番目のボタンをタップすることを混同していると考えられます。

状況を示すスクリーンショット

最初の画面
最初のボタンをタップ
2番目のボタンをタップしてアラートがでたところ
アラートのOKをタップした結果の画面

原因を内蔵すると考えられるコード

var count = 0 @IBAction func lockButtonTapped(_ sender: Any) { // ロックボタンを押した回数を1増やす count = count + 1 //略略略 _ = displayImage() guard let lockButtonTapped = sender as? UIButton else { return } //複数セルの場合のコード switch lockButtonTapped.tag { // Image Viewに読み込んだ画像をセット case 6: //最初のボタン if count % 2 == 1 { print ("ここまで来た case 6") textTimeDep01DepCell01.isUserInteractionEnabled = false imageLockDep01DepCell01.image = UIImage(named: "KagiLock") print ("ここまで来た case 6ロック") } //残りが0の場合 else if count % 2 == 0 { // アラートの実装 let alert = UIAlertController(title: "記入済みの時刻を削除します。", message: "表示のOKを押すと削除されて新規に書き込みができます。このまま保存したい場合はキャンセルを押してください", preferredStyle: .alert) let cancelAction = UIAlertAction(title: "Cancel", style: .default) let okAction = UIAlertAction(title: "OK", style: .destructive) { (action: UIAlertAction) in //OKをタップするとイメージがオープンになり、textFieldが空になりキーボードが現れインプット可能になる self.imageLockDep01DepCell01.image = UIImage(named: "KagiOpen") self.textTimeDep01DepCell01.isUserInteractionEnabled = true self.textTimeDep01DepCell01.text = "" } alert.addAction(cancelAction) alert.addAction(okAction) present(alert, animated: true, completion: nil) } case 7: //2番目のボタン if count % 2 == 1 { print ("ここまで来た case 7") //略略略 //case16から19まで続きます。 }

試みた対策

上記の count = count + 1のコードにif文を入れて「同じボタンがタップされた場合」即ち「ボタンタブ番号が同じ場合」という条件を入れようとしました。トライしたコードは下記のとおりですが記入した条件コードが適切でないのかビルド結果は同じで先に進めないのでご教示ください。

試みたコード

///////////// ロックボタン機能 var count = 0 @IBAction func lockButtonTapped(_ sender: Any) { //タップされたボタンのtag番号が同じなら // ロックボタンを押した回数を1つ増やす if [(sender as AnyObject).tag] == [(sender as AnyObject).tag] { count = count + 1 print ("ここまで来たIBAction lockImageに1を加える") } else { return } _ = displayImage() guard let lockButtonTapped = sender as? UIButton else { return }

ご参考事項

環境は下記のとおりです。
MacBook Pro (15-inch, 2016)
High Sierra OS10.13.6
Xcode Version 9.4 (9F1027a)Swift4

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

鍵ボタンが14個あるのに対して、鍵チェックで利用しているcount変数が1つしかありませんよね。

ケース1)

1番目の鍵を押してロック。 => count = 1 1番目の鍵を押してロック解除。 => count = 2 【 count % 2 == 0 のため アラートが表示される 】

ケース2)

1番目の鍵を押してロック。 => count = 1 2番目の鍵を押してロック。 => count = 2 【 count % 2 == 0 のため アラートが表示されてしまう 】

今の実装を活かすのであれば、count変数も14個必要だと思います。

var counts: [Int] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

switch lockButtonTapped.tag { case 6: //最初のボタン if count[0] % 2 == 1 { // 省略 } else if count[0] % 2 == 0 { // 省略 case 7: //2番目のボタン if count[1] % 2 == 1 { // 省略

いかがでしょうか?

後からボタンを押した回数が必要になるのであればNGなのですが、
鍵ボタンの状態はon/off しかないので、

countが奇数だったらロック、偶数だったらロック解除

よりは

isLockがtrueだったらロック、falseだったらロック解除

など bool型を使った方が良いかもしれませんね。

投稿2018/11/21 08:38

norinor

総合スコア42

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

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

Tomzy

2018/11/21 09:39

ありがとうございます。tappedされたtag番号を取得して同じ番号の場合とそうでない場合をif文にして追求していたのですが、上手く行きませんでした。教えて頂いた方法を目下試していますが、まだ成功していません。どこか私のコードがおかしのだと思います。また、ご報告します。 var counts: (Int) = [0,0,0,0,0,0,0,0,0,0,0,0,0,0]でなく var counts: (Index) = [0,0,0,0,0,0,0,0,0,0,0,0,0,0]順番でも試してやっています。 と定義すると、
Tomzy

2018/11/22 02:00

教えて頂いた方法をやってみました。ただ、if count[0] % 2 == 1 {とするとエラーになるのでif counts[0] % 2 == 1 {でやりました。 結果はどのボタンでもロック解除のアラートがでてロックはしませんでした。検証のため print (count) print (counts) を入れましたら 0 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] や 1 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] と表示されます。
Tomzy

2018/11/22 02:12

3つの方法を模索しています。3つめのCCCは不格好なコードですが成功をしています。 AAA タップされたボタンの順番番号を取得するコードを使って if counts == counts { count = count + 1 } else { count = count + 2 } とする方法ですが、タップされたボタンの順番番号を取得するコードが分からず行き詰まっています。取得するコードを教えて頂ければ幸いです。 BBB Arrayを使い、イメージがオープンしているなら、ロックのコード、もしイメージがロックされているならアラートを出して解錠するコード。これはエラーが続出して成功していません。 CCC countは使わずに各caseに下記のコードを書きました。これは意図したとおりの機能になっています。 if imageLockDep01DepCell01.image == UIImage(named: "KagiOpen") { textTimeDep01DepCell01.isUserInteractionEnabled = false imageLockDep01DepCell01.image = UIImage(named: "KagiLock") print ("ここまで来た case 6ロック") } else { // アラートの実装 let alert = UIAlertController(title: "記入済みの時刻を削除 //以下略略略略 present(alert, animated: true, completion: nil) }
Tomzy

2018/11/22 02:16

isLockがtrueだったらロック、falseだったらロック解除の方法も検討してみます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問