UIAlertView在iPhone中被称为Twice

时间:2012-07-24 09:18:03

标签: iphone ios ipad uigesturerecognizer uialertview

  

可能重复:
  UILongPressGestureRecognizer on UITableViewCell - double call

我是iPhone新手,

我按下长按钮时显示警告,但是当我长按按钮时,我的警报视图会再次被调用。

这是我的代码段,

- (IBAction)longPressDetected:(UIGestureRecognizer *)gestureRecognizer {

    //Gets text of Button.
    UIButton *btn = (UIButton *)[gestureRecognizer view];
    BtnText= [btn titleForState:UIControlStateNormal];
    NSLog(@"longPressDetected");

    UIAlertView* alert_view = [[UIAlertView alloc]
                               initWithTitle: @"Are you sure want to Delete ?" message:nil delegate: self 
                               cancelButtonTitle: @"Yes" otherButtonTitles: @"No", nil];
    [alert_view show];
    [alert_view release];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{ 
    if (buttonIndex==0) {

        [self ReloadView];
         [alertView dismissWithClickedButtonIndex:0 animated:TRUE];
    }
    else{
        [alertView dismissWithClickedButtonIndex:1 animated:TRUE];
    }
}

我们将不胜感激。

修改

  -(void)viewWillAppear:(BOOL)animated
   {
         for(int i=0;i<10i++)
            {

                if(i!=0)
                {
                    if (i%4==0) 
                    {                    
                        ypos+=180;
                        xpos=30;
                    }
                    else
                    {
                        xpos+=200;
                    }
                }


                button = [UIButton buttonWithType:UIButtonTypeCustom];
                button.frame = CGRectMake(xpos, ypos, 120,130);
                [button setBackgroundImage:[UIImage imageNamed:@"ibook2.png"] forState:UIControlStateNormal];
                [button setTitle:[NSString stringWithFormat:@"%@", [Downloadedepubs objectAtIndex:i]] forState:UIControlStateNormal];
                [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];

                 LongPress = [[UILongPressGestureRecognizer alloc] init];
                [LongPress addTarget:self action:@selector(longPressDetected:)];
                 LongPress.delegate = (id<UIGestureRecognizerDelegate>)self;
                [button addGestureRecognizer:LongPress];
                [self.view addSubview:button];
                [LongPress release];

      } 

   }

2 个答案:

答案 0 :(得分:6)

UILongPressGestureRecognizer是一个漫长的事件过程。请检查事件状态是否已开始,已完成等。

- (IBAction)longPressDetected:(UIGestureRecognizer *)gestureRecognizer {        

    if (gestureRecognizer.state == UIGestureRecognizerStateBegan){

        NSLog(@"Long press began");

    } else if ( gestureRecognizer.state == UIGestureRecognizerStateRecognized ) {

            NSLog(@"Long press UIGestureRecognizerStateRecognized");
    }
    else if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {

        NSLog(@"Long press Ended");
    }
    else {

        NSLog(@"Long press detected.");
    }       
}

我认为,最好在你的情况下使用 UIGestureRecognizerStateBegan 状态。

请将您的longPressDetected()修改为

 -(IBAction)longPressDetected:(UIGestureRecognizer *)gestureRecognizer {

   if (gestureRecognizer.state == UIGestureRecognizerStateBegan){

       UIButton *btn = (UIButton *)[gestureRecognizer view];
       BtnText= [btn titleForState:UIControlStateNormal];
       NSLog(@"longPressDetected");

      UIAlertView* alert_view = [[UIAlertView alloc] initWithTitle: @"Are you sure want to Delete ?" message:nil delegate: self cancelButtonTitle: @"Yes" otherButtonTitles: @"No", nil];
      [alert_view show];
      [alert_view release];
      alert_view = nil;

   }
 }

请检查以下所有 UIGestureRecognizerStates

    UIGestureRecognizerStatePossible,   // the recognizer has not yet recognized its gesture, but may be evaluating touch events. this is the default state

    UIGestureRecognizerStateBegan,      // the recognizer has received touches recognized as the gesture. the action method will be called at the next turn of the run loop
    UIGestureRecognizerStateChanged,    // the recognizer has received touches recognized as a change to the gesture. the action method will be called at the next turn of the run loop
    UIGestureRecognizerStateEnded,      // the recognizer has received touches recognized as the end of the gesture. the action method will be called at the next turn of the run loop and the recognizer will be reset to UIGestureRecognizerStatePossible
    UIGestureRecognizerStateCancelled,  // the recognizer has received touches resulting in the cancellation of the gesture. the action method will be called at the next turn of the run loop. the recognizer will be reset to UIGestureRecognizerStatePossible

    UIGestureRecognizerStateFailed,     // the recognizer has received a touch sequence that can not be recognized as the gesture. the action method will not be called and the recognizer will be reset to UIGestureRecognizerStatePossible

    // Discrete Gestures – gesture recognizers that recognize a discrete event but do not report changes (for example, a tap) do not transition through the Began and Changed states and can not fail or be cancelled
    UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // the recognizer has received touches recognized as the gesture. the action method will be called at the next turn of the run loop and the recognizer will be reset to UIGestureRecognizerStatePossible

答案 1 :(得分:0)

即使不需要输入UILongPressGestureRecognizer详细信息,您也可以做一些简单的事情来解决这个问题。定义BOOL isShowingAlertView。当您致电[alertView show]时,您需要设置isShowingAlertView = YES,当您将其解雇时,isShowingAlertView = NO。在致电之前,您只需检查:if (isShowingAlertView == NO),然后才能显示:

-(void)viewDidLoad
{
    [super viewDidLoad];
    isShowingAlert = NO;
}

- (IBAction)longPressDetected:(UIGestureRecognizer *)gestureRecognizer {

    if (isShowingAlert == NO)
    {
        isShowingAlert = YES;
        //Gets text of Button.
        UIButton *btn = (UIButton *)[gestureRecognizer view];
        BtnText= [btn titleForState:UIControlStateNormal];
        NSLog(@"longPressDetected");

        UIAlertView* alert_view = [[UIAlertView alloc]
                               initWithTitle: @"Are you sure want to Delete ?" message:nil delegate: self 
                               cancelButtonTitle: @"Yes" otherButtonTitles: @"No", nil];
        [alert_view show];
        [alert_view release];
    }
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    isShowingAlert = NO;
    if (buttonIndex==0)
    {
        [self ReloadView];
    }
}