問題は、複数のアラート ビューが表示されていることです。長押しハンドラーは、さまざまな状態で呼び出されます。
のドキュメントからUILongPressGestureRecognizer
:
長押しジェスチャは連続です。許容される指の数 (numberOfTouchesRequired) が指定された期間 (minimumPressDuration) の間押され、タッチが許容範囲 (allowableMovement) を超えて移動しない場合、ジェスチャが開始されます (UIGestureRecognizerStateBegan)。ジェスチャ レコグナイザーは、指が動くたびに Change 状態に遷移し、いずれかの指が離されると終了します (UIGestureRecognizerStateEnded)。
したがって、「Began」状態、次に「Changed」状態、および「Ended」状態のアラートを表示することになります。指を動かすと、一連の「変更済み」状態が表示され、それらのすべてについてもアラートが表示されます。
アラートを実際にいつ表示するかを決定する必要があります。最初の「変更済み」状態で表示するか、ユーザーが指を離して「終了」状態になったときに表示しますか。
コードは次のようにする必要があります。
- (IBAction)longPressDetected1:(UIGestureRecognizer *)sender {
if (sender.state == UIGestureRecognizerStateEnded) {
// label1.text = @"Select Iran to observe its historical data projections ";
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@""
message:@"Press the blue button (+) to select your region "
delegate:self
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alert show];
}
}
これにより、ユーザーが指を離したときにアラートが表示されます。長押しが認識されたらすぐにアラートを表示する場合は、に変更UIGestureRecognizerStateEnded
しUIGestureRecognizerStateChanged
ます。ただし、長押しすると複数の「変更済み」状態が生成される可能性があるため、複数の状態になる可能性があることに注意してください。この場合、追加のチェックを追加して、まだアラートがない場合にのみアラートを表示する必要があります。
実際、「変更済み」状態で単一のアラートをサポートする簡単な方法を次に示します。
- (IBAction)longPressDetected1:(UIGestureRecognizer *)sender {
if (sender.state == UIGestureRecognizerStateChanged) {
sender.enabled = NO; // Prevent any more state updates so you only get this one
sender.enabled = YES; // reenable the gesture recognizer for the next long press
// label1.text = @"Select Iran to observe its historical data projections ";
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@""
message:@"Press the blue button (+) to select your region "
delegate:self
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alert show];
}
}