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

Posted

技术标签:

【中文标题】UIAlertView 警报在长按手势识别器中重复三次【英文标题】:UIAlertView alert repeat three times within long press gesture recognizer 【发布时间】:2013-03-09 03:51:21 【问题描述】:

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

这是我的代码:

- (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 不能一键取消。 你能帮帮我吗?

【问题讨论】:

这和 php 有什么关系? 对不起,这是 ipad 应用 【参考方案1】:

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

来自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];
    

【讨论】:

好答案,当您希望在识别出长按后立即出现警报时,您需要与 UIGestureRecognizerStateBegan 进行比较,而不是...更改。【参考方案2】:

试试这个

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

【讨论】:

这如何解决显示多个警报视图或需要点击取消三次的问题? 我认为你在 viewcontroller 中使用了不止一个 alertview【参考方案3】:

这是一个老问题,但我有一个类似的问题。

任何 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 之禅

【讨论】:

以上是关于UIAlertView 警报在长按手势识别器中重复三次的主要内容,如果未能解决你的问题,请参考以下文章

仅在长按识别器触发后执行平移手势识别器

长按手势在 UIButton 中显示图像

如何用点击手势关闭 SDCAlertView?

长按手势识别器产生重复位置 (SWIFT)

长按手势识别器触发两次[重复]

允许 UIScrollView 在长按处于活动状态时通过第二次触摸滚动