UIAlertView警报在长按手势识别器中重复三次

时间:2013-03-09 03:51:22

标签: ios uigesturerecognizer uialertview

我创建了一个应用程序。通过开发它,我使用长按按钮显示警报。

这是我的代码:

- (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时,我必须按三次此按钮才能取消UIAlertView。这意味着UIAlterview只能通过一个印刷机取消。 你能帮我吗?

3 个答案:

答案 0 :(得分:9)

问题是您正在显示多个警报视图。你的长按处理程序将被调用不同的状态。

来自UILongPressGestureRecognizer的文档:

  

长按手势是连续的。当指定时间段(minimumPressDuration)按下允许的手指数(numberOfTouchesRequired)并且触摸不超出允许的移动范围(allowableMovement)时,手势开始(UIGestureRecognizerStateBegan)。每当手指移动时,手势识别器都会转换到更改状态,并且当任何手指抬起时,手势识别器会结束(UIGestureRecognizerStateEnded)。

因此,您最终会显示“开始”状态的警报,然后显示“已更改”状态,并再次显示“已结束”状态。如果你用手指移动,你会得到一个“已更改”状态的流,你最终也会为每个人显示一个警报。

您需要确定何时希望显示警报。您是希望它出现在第一个“已更改”状态,还是当用户抬起手指并且您处于“已结束”状态时。

您的代码必须是这样的:

- (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];
    }
}

答案 1 :(得分: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;
     }
}

答案 2 :(得分:0)

这是一个老问题,但我遇到了类似的问题。

任何UILongPressGestureRecognizer都会生成至少4次状态更改:

  • 已更改 - (即已更改为已启动)
  • 开始 - (即开始)
  • 已更改 - (即已更改为已结束)
  • 结束 - (即结束)

因此,为了更好地处理它,您需要选择哪些条件将激活一个动作。

最简单的,对应于UIButton的“内部触摸”,就是检测“已结束”状态。

下面是一个例子,其中'longPress'是UILongPressGestureRecognizer的实例

- (void)longPressedLastImage:(UILongPressGestureRecognizer*) longPress {
    if (longPress.state == UIGestureRecognizerStateEnded) {
       // do what you would in response to an equivalent button press 
    }
}

这使您可以更像基本的UIButton操作来处理连续按下。

'简单比复杂更好' - T Peters - Python的禅宗