希望你们都做得很好。
我的问题出在哪里,一个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个小时以来,我一直在努力解决这个问题,这里的一些答案也不是我工作的背景。任何人都可以告诉我我错在哪里。
由于
答案 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的引用,然后删除了对第一个按钮的引用。问题解决了。什么样的恶梦。希望这有助于某人。