魚ー うおー 浜った!!
iOSでラベル(UILabel)にタップ認識(UITapGestureRecognizer)を追加しようとして
検索するとだいたいラベルのuserInteractionEnabledをYESにしろっていうのが出てくる。そんなの知ってるC。。。素人じゃあるまいし。素人だけど
で、最初に書いてたコードがこれ。1~3までの回答が書かれたラベルエリアがあって、誤った回答をタップするとaddGestureRecognizerした処理が実行されたい、という意図
試してみても動かない
[cpp]
UITapGestureRecognizer *wrongAnswerRecognizer = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(wrongAnswer:)];
wrongAnswerRecognizer.numberOfTapsRequired = 1;
int correct_answer = [[self.entity valueForKey:@"correct_answer"] integerValue];
if (correct_answer == 1) {
[label2 addGestureRecognizer:wrongAnswerRecognizer];
[label3 addGestureRecognizer:wrongAnswerRecognizer];
} else if (correct_answer == 2) {
[label1 addGestureRecognizer:wrongAnswerRecognizer];
[label3 addGestureRecognizer:wrongAnswerRecognizer];
} else if (correct_answer == 3) {
[label1 addGestureRecognizer:wrongAnswerRecognizer];
[label2 addGestureRecognizer:wrongAnswerRecognizer];
}
[/cpp]
この間にいろんなヘンな事を試すわけです。ラベルの境界線が重なりあって、タップが認識されていないのでは?って疑ってボーダー出してみてラベルの大きさとか位置とか確認したり。もしかしてラベルの下のビュー(superview)のuserInteractionEnableもYESにしないとダメなの?とか。結局イライラして画面連打してたら、3番目の回答をタップしたら処理が実行された!!
デバッグ中の画面の正解回答は2番。ずっとデバッグで1番の不正解ばかり確認してたのでした
そして、修正したコードがこちら
[cpp]
int correct_answer = [[self.entity valueForKey:@"correct_answer"] integerValue];
if (correct_answer == 1) {
[label2 addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(wrongAnswer:)]];
[label3 addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(wrongAnswer:)]];
} else if (correct_answer == 2) {
[label1 addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(wrongAnswer:)]];
[label3 addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(wrongAnswer:)]];
} else if (correct_answer == 3) {
[label1 addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(wrongAnswer:)]];
[label2 addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(wrongAnswer:)]];
}
[/cpp]
同じインスタンスを複数のラベルに指定すると、どうやら後から追加した方にもっていかれるようです。そんなもんで、タップ認識オブジェクト(UITapGestureRecognizer)は必ずView毎にインスタンス化する必要があるようです
知っていれば当然のような事に見えるけど、知らないとハマるかもしれないようなシチュエーション。意外とこういう地味な事に数時間費やしちゃう場合とかある
コメントを残す