Ios mapView:DIDDENCENOTANTIONVIEW:在实际取消选择注释视图之前调用委托方法

Ios mapView:DIDDENCENOTANTIONVIEW:在实际取消选择注释视图之前调用委托方法,ios,annotations,mkmapview,mkannotationview,mkmapviewdelegate,Ios,Annotations,Mkmapview,Mkannotationview,Mkmapviewdelegate,我正在使用一个由自定义管脚填充的地图视图。当用户点击地图上的某个位置以取消选择管脚时,我希望实现该地图,以便管脚不会被取消选择(即,用户无法在不选择其他管脚的情况下取消选择管脚,因此至少会选择一个管脚)。以下是我对DidDecleAnnotationView方法的实现: -(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view { [mapView selectAnnota

我正在使用一个由自定义管脚填充的地图视图。当用户点击地图上的某个位置以取消选择管脚时,我希望实现该地图,以便管脚不会被取消选择(即,用户无法在不选择其他管脚的情况下取消选择管脚,因此至少会选择一个管脚)。以下是我对DidDecleAnnotationView方法的实现:

-(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
    [mapView selectAnnotation:view.annotation animated:NO];
}
基本上,我正在尝试重新选择注释。然而,在一些调试和打印到控制台之后,我意识到注释视图实际上并没有被取消选择,直到方法DIDDENDECEANNOTATIONVIEW:完成运行(也就是说,事件的顺序是:用户点击地图上的某个地方,调用并完成执行,注释视图实际上被取消选择)。是否有其他人遇到过此问题,或者是否有人知道另一种方法来强制地图的行为,以便用户无法在不选择其他管脚的情况下取消选择管脚,从而始终选择一个管脚


感谢您的帮助。

请尝试将重新选择推迟到
取消选择注释视图
完成后:

-(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
    [self performSelector:@selector(reSelectAnnotationIfNoneSelected:) 
            withObject:view.annotation afterDelay:0];
}

- (void)reSelectAnnotationIfNoneSelected:(id<MKAnnotation>)annotation
{
    if (mapView.selectedAnnotations.count == 0)
        [mapView selectAnnotation:annotation animated:NO];
}
-(void)mapView:(MKMapView*)mapView取消注释视图:(MKAnnotationView*)视图
{
[自执行选择器:@selector(重新选择AnnotationIfNoneSelected:)
withObject:view.annotation afterDelay:0];
}
-(无效)重新选择注释未选择:(id)注释
{
如果(mapView.selectedAnnotations.count==0)
[地图视图选择注释:注释动画:否];
}

我也有类似的问题,但情况正好相反

根据所选的管脚,表格将滚动到相应的单元格。如果未选择管脚,表格将滚动回第一个单元格。当选择另一个管脚时,取消选择方法将在调用选择方法的同时被调用,表格将不会根据需要滚动

下面的代码解决了这个问题,是对Anna解决方案的一个轻微修改

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKPinAnnotationView *)view
{
   if ([view.annotation isKindOfClass:[MKUserLocation class]]) 
        return;

    [self performSelector:@selector(resetTableScroll:) 
           withObject:view.annotation afterDelay:.5];
    }



- (void)resetTableScroll:(id<MKAnnotation>)annotation{

    if (theMap.selectedAnnotations.count == 0)
    {
        NSIndexPath *position = [NSIndexPath indexPathForRow:0 inSection:0];
        [[self theTable] scrollToRowAtIndexPath:position atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
    }}
-(void)地图视图:(MKMapView*)地图视图取消注释视图:(MKPinAnnotationView*)视图
{
if([view.annotation iskindof类:[MKUserLocation类]])
返回;
[自执行选择器:@选择器(resetTableScroll:)
withObject:view.annotation afterDelay:.5];
}
-(void)resetTableScroll:(id)注释{
如果(theMap.selectedAnnotations.count==0)
{
NSIndexPath*位置=[NSIndexPath indexPathForRow:0第1节:0];
[[self-theTable]ScrollToRowatinexPath:position At ScrollPosition:UITableView ScrollPosition Middle animated:YES];
}}

编辑:请记住,此方法可防止选择任何其他PIN,这在创建此答案时是未知的。很可能,这不是您想要的行为

我知道这是一个老生常谈的问题,但接受的答案在iOS 8中对我不起作用。对我起作用的是完全禁用默认情况下包含在MKMapView中的UITapgestureRecognitor

- (void)disableTapRecognizerForMapView:(MKMapView *)mapView {
    NSArray *a = [[self.mapView.subviews objectAtIndex:0] gestureRecognizers];

    for (id gesture in a)
        if ([gesture isKindOfClass:[UITapGestureRecognizer class]])
            [gesture setEnabled:NO];
}
希望这能帮助其他人

干杯!

安娜的回答太棒了。 这里是Swift 3或4:D的答案

func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
    perform(#selector(MyViewController.reSelectAnnotationIfNoneSelected(_:)), with: view.annotation, afterDelay: 0)
}

func reSelectAnnotationIfNoneSelected(_ annotation: MKAnnotation) {
    if mapView.selectedAnnotations.count == 0 {
        mapView.selectAnnotation(annotation, animated: false)
    }
}

如果为“地图视图”添加手势,请尝试以下操作:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;

返回否,有效

如果我这样做,就不可能在地图上选择任何注释。你是如何解决这个问题的?@gebirgsbärbel说实话,我不记得我是如何解决的,但我的应用程序中当前的行为是允许用户不选择PIN,这让我觉得我没有找到解决办法。我会更新答案为了反映这种行为。非常感谢您对我的快速回答,只有在
annotationView.canShowCallout=false