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

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

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

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

Xcode

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

Swift

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

Q&A

解決済

1回答

307閲覧

UIImageViewのタップ処理

sena14

総合スコア109

iOS

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

Xcode

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

Swift

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

0グッド

1クリップ

投稿2018/11/26 14:13

編集2018/11/26 14:16

下記の様なコードで四択クイズの様なものを作っているのですが、回答を選択するところがうまくいきません。

setQuestion()で問題をランダムに生成。
setAnswer()で回答選択肢のimageViewに画像をセットし、その後正解の配置を決定し正解のimageViewだけ上書きで画像を設定。それぞれの選択肢にtapAnswer()のタップイベントを設定。
正解の画像タップでスコアをプラスし次の問題へ。間違った場合ライフをマイナス。
といったことを実装したいのですが、実際の挙動は4番目のimageViewをタップした場合だけ4択の画像だけが代わり問題の画像の変更やスコアの変動などの処理が行われません。また確認のためのprint()も表示されていません。
なぜ4番目だけ動きがあるのかといったことやsetAnswer()の処理だけ行われるのかが全くわからず困っています。

よろしくお願いします。

import UIKit class GameViewController: UIViewController { var score = 0 var life = 3 var correct = 0 @IBOutlet weak var qiv1: UIImageView! @IBOutlet weak var qiv2: UIImageView! @IBOutlet weak var aiv1: UIImageView! @IBOutlet weak var aiv2: UIImageView! @IBOutlet weak var aiv3: UIImageView! @IBOutlet weak var aiv4: UIImageView! @IBOutlet weak var heart1: UIImageView! @IBOutlet weak var heart2: UIImageView! @IBOutlet weak var heart3: UIImageView! @IBOutlet weak var scoreLabel: UILabel! var hearts :[UIImageView] = [UIImageView]() override func viewDidLoad() { super.viewDidLoad() hearts = [heart1,heart2,heart3] setQuestion() } //問題を設定 func setQuestion(){ //省略 setAnswer() } //回答を設定 @objc func setAnswer(){ let ivs = [aiv1,aiv2,aiv3,aiv4] for iv in ivs{ //問題の画像をセット } //正解の場所を設定 correct = Int.random(in: 0...3) ivs[correct]?.image = UIImage(named: "正解の画像") let tap = UITapGestureRecognizer(target: self, action: #selector(self.tapAnswer)) for iv in ivs{ iv?.addGestureRecognizer(tap) } } //答えタップ時 func tapAnswer(sender: UITapGestureRecognizer){ let tappedView = sender.view as? UIImageView print("tap") if(tappedView!.tag == correct){ score += 1 scoreLabel.text = String(score) setQuestion() }else{ life -= 1 hearts[life].image = UIImage(named: "damageHeart") if(life == 0){ gameOver() } } } //ゲームオーバー func gameOver(){ //省略 } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

UIGestureRecognizer系は複数のビューで使い回すことができません。

各ImageView毎にUITapGestureRecognizerのインスンタンスを生成し、割り当ててください。

こんな感じで期待通りに動きませんでしょうか?

swift

1 for iv in ivs{ 2 let tap = UITapGestureRecognizer(target: self, action: #selector(self.tapAnswer)) 3 iv?.addGestureRecognizer(tap) 4 }

投稿2018/11/27 00:57

編集2018/11/27 01:23
takabosoft

総合スコア8356

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

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

sena14

2018/11/27 06:46

無事できました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問