UIAlertView显示两次

时间:2014-01-07 09:57:07

标签: ios iphone uialertview

希望你们都做得很好。

我的问题出在哪里,一个UIAlertView在执行代码时显示两次。我在-(void)viewDidAppear:(BOOL)animated内写了它,如下所示

-(void)viewDidAppear:(BOOL)animated
{
//Finding city Name from coordinate
    UIAlertView * alertForCoordinate=[[UIAlertView alloc]initWithTitle:@"Coordinate" message:[NSString stringWithFormat:@"latitude==>%f\nlongitude==>%f",self.userLocation.coordinate.latitude,self.userLocation.coordinate.longitude] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil,nil];        
    [alertForCoordinate show];

    [SVGeocoder reverseGeocode:CLLocationCoordinate2DMake(self.userLocation.coordinate.latitude, self.userLocation.coordinate.longitude)
     completion:^(NSArray *placemarks, NSHTTPURLResponse *urlResponse, NSError *error)
    {

        if (placemarks.count>0)
        {

            CLPlacemark * placemark=[placemarks objectAtIndex:0];
            currentLocationUpcoming =[placemark locality];

            UIAlertView * alert=[[UIAlertView alloc]initWithTitle:@"Location" message:[NSString stringWithFormat:@"currentLocation==>%@",currentLocationUpcoming] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
            [alert show];

            [self.eventsTableView reloadData];

        }

    }];

}

当视图显示时,首先UIAlertView会自动呼叫并解除,然后第二次接听电话当我点击第二个提醒的确定按钮时,会再次显示UIAlertView。自从过去4个小时以来,我一直在努力解决这个问题,这里的一些答案也不是我工作的背景。任何人都可以告诉我我错在哪里。

由于

5 个答案:

答案 0 :(得分:3)

你实际上没有第一个UIAlertView显示两次 - 动画只是让它看起来像这样,因为你连续显示两个UIAlertView。你可能会看到警报1->警报2->在提醒2上点击确定 - >警报1.这是因为如果显示多个,UIAlertView会叠加。

以这种方式思考:警报1首先显示但动画只显示一段非常短暂的时间,直到它被警报2显示中断。解除警报2再次激活屏幕上的警报1,即使它仍然是相同的警报,它看起来像是显示两次。

试试这个简单的测试用例:

-(void)viewDidAppear:(BOOL)animated
{
    [[[UIAlertView alloc] initWithTitle:@"Alert #1" message: delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
    [[[UIAlertView alloc] initWithTitle:@"Alert #2" message: delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
}

您将在几分之一秒内看到“警报#1”,然后“警报#2”将保留在屏幕上。在“警报#2”上点击“确定”将再次显示“警报#1”,因为它低于堆栈上的警报#2。

答案 1 :(得分:1)

第二个警报与第一个警报重叠,在解除第二个警报后,第一个警报出现在屏幕上。

-(void)viewDidAppear:(BOOL)animated
{
    UIAlertView * alertForCoordinate=[[UIAlertView alloc]initWithTitle:@"Coordinate" message:[NSString stringWithFormat:@"latitude==>%f\nlongitude==>%f",self.userLocation.coordinate.latitude,self.userLocation.coordinate.longitude] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil,nil];
    alertForCoordinate.tag = 1;
    [alertForCoordinate show];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (buttonIndex == 0 && alertView.tag == 1) {
        [SVGeocoder reverseGeocode:CLLocationCoordinate2DMake(self.userLocation.coordinate.latitude, self.userLocation.coordinate.longitude)
                        completion:^(NSArray *placemarks, NSHTTPURLResponse *urlResponse, NSError *error)
         {

             if (placemarks.count>0)
             {

                 CLPlacemark * placemark=[placemarks objectAtIndex:0];
                 currentLocationUpcoming =[placemark locality];
                 /*****************Second Alert******************/
                 UIAlertView * alert=[[UIAlertView alloc]initWithTitle:@"Location" message:[NSString stringWithFormat:@"currentLocation==>%@",currentLocationUpcoming] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
                 [alert show];

                 [self.eventsTableView reloadData];

             }

         }];
    }
}

答案 2 :(得分:1)

我有同样的问题" UIAlertView显示两次",但在我的情况下,这是因为长按手势识别器的编码错误(与原始问题不同,但可能对谷歌uialertview的其他人有用显示两次)。处理长按的内部方法,我称之为显示UIAlertView的方法。我的错误是没有回想起每次用户长按时手柄长按方法被调用两次(一次按下并按住,一次当用户松开手指时)。正确的代码识别手势状态(下面的代码)。

-(IBAction)handleHoldOnContact:(UILongPressGestureRecognizer*)sender {

    if (sender.state == UIGestureRecognizerStateBegan){
        // NSLog(@"UIGestureRecognizerStateBegan hold");
        //Do Whatever You want on Began of Gesture
        // ...            
    } else if (sender.state == UIGestureRecognizerStateEnded) {
        // NSLog(@"UIGestureRecognizerStateEnded release");
        //Do Whatever You want on End of Gesture
        // ...
    }
}

答案 3 :(得分:0)

我也得到同样的问题。为了克服这个问题,我做了以下几件事。将alertview作为全局变量。然后,

if(!alertForCoordinate){
       alertForCoordinate=[[UIAlertView alloc]initWithTitle:@"Coordinate" message:[NSString stringWithFormat:@"latitude==>%f\nlongitude==>%f",self.userLocation.coordinate.latitude,self.userLocation.coordinate.longitude] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil,nil];        
       [alertForCoordinate show];
}

之后,当您点击Alertview中的"OK"按钮时。将其设置为nil。如下所示,

alertForCoordinate = nil;

希望,这会对你有帮助。

答案 4 :(得分:0)

可能是在main.storyboard中复制按钮的情况,因此也就是它的IBaction引用。

我在main.storyboard中有一个完美样式的按钮,所以我拖动复制它并将新的IBaction附加到viewController。我没有意识到这一点,但当我点击那个新按钮时,它为第一个按钮和第二个按钮启动了IBaction,因为它与两个按钮相连,因为它是第一个按钮的副本。

我右键单击main.storyboard中的第二个按钮,从第一个按钮和第二个按钮看到了对IBaction的引用,然后删除了对第一个按钮的引用。问题解决了。什么样的恶梦。希望这有助于某人。