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 警报在长按手势识别器中重复三次的主要内容,如果未能解决你的问题,请参考以下文章