我创建了一个应用程序。通过开发它,我使用长按按钮显示警报。
这是我的代码:
- (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只能通过一个印刷机取消。 你能帮我吗?
答案 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的禅宗