0

アプリケーションを作成しました。それを開発することで、長押しボタンを使用してアラートを表示しました。

これは私のコードです:

- (IBAction)longPressDetected1:(UIGestureRecognizer *)sender {
    //     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];    
}

質問: cancelIbutton を使用して UIAlertView をキャンセルしたい場合、このボタンを 3 回押して UIAlertView をキャンセルする必要があります。UIAlterview を 1 回押しただけではキャンセルできないということです。手伝っていただけませんか?

4

3 に答える 3

9

問題は、複数のアラート ビューが表示されていることです。長押しハンドラーは、さまざまな状態で呼び出されます。

のドキュメントから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];
    }
}

これにより、ユーザーが指を離したときにアラートが表示されます。長押しが認識されたらすぐにアラートを表示する場合は、に変更UIGestureRecognizerStateEndedUIGestureRecognizerStateChangedます。ただし、長押しすると複数の「変更済み」状態が生成される可能性があるため、複数の状態になる可能性があることに注意してください。この場合、追加のチェックを追加して、まだアラートがない場合にのみアラートを表示する必要があります。

実際、「変更済み」状態で単一のアラートをサポートする簡単な方法を次に示します。

- (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];
    }
}
于 2013-03-09T04:35:32.113 に答える
0

これを試して

- (IBAction)longPressDetected1:(UIGestureRecognizer *)sender {
//     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.tag =10;
[alert show];    

}

- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex {

  switch (alertView.tag)
{
    case 10:
        if (buttonIndex==0)
        {

        }
        break;
     }
}
于 2013-03-09T04:35:17.863 に答える