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

问题:当我想通过cancelI按钮取消UIAlertView时,我必须按此按钮3次才能取消UIAlertView。这意味着 UIAlterview 不能一键取消。请你帮助我好吗?

4

3 回答 3

9

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

从文档中UILongPressGestureRecognizer

长按手势是连续的。当允许的手指数量 (numberOfTouchesRequired) 在指定的时间 (minimumPressDuration) 内被按下并且触摸没有超出允许的移动范围 (allowableMovement) 时,手势开始 (UIGestureRecognizerStateBegan)。每当手指移动时,手势识别器就会转换到 Change 状态,并在任何手指抬起时结束 (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];
    }
}
于 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 回答
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 之禅

于 2017-10-18T00:17:03.437 回答