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

时间:2011-08-03 19:19:13

标签: ios annotations mkmapview mkannotationview mkmapviewdelegate

我正在使用填充了自定义引脚的地图视图。当用户点击地图上的某个地方取消选择一个引脚时,我想实现地图,这样引脚就不会被取消选择(即用户无法在不选择其他引脚的情况下取消选择引脚,因此至少会选择一个引脚)。这是我对didDeselectAnnotationView方法的实现:

-(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
    [mapView selectAnnotation:view.annotation animated:NO];
}

基本上,我正在尝试重新选择注释。但是,经过一些调试和打印到控制台后,我意识到注释视图实际上并没有被取消选择,直到方法didDeselectAnnotationView:完成运行(即事件顺序为:用户点击地图上的某个地方,didDeselectAnnotationView:被调用并完成执行,实际取消选择注释视图)。有没有其他人遇到过这个问题,或者是否有人知道另一种强制执行地图行为的方法,这样用户无法在不选择其他引脚的情况下取消选择引脚,以便始终选择一个引脚?

感谢您的帮助。

5 个答案:

答案 0 :(得分:10)

尝试推迟重新选择,直到didDeselectAnnotationView完成:

-(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];
}

答案 1 :(得分:1)

编辑:请记住,此方法会阻止选择任何其他引脚,这在创建此答案时是未知的。机会是,这不是你想要的行为。

我知道这是一个老问题,但在iOS 8中,我接受的答案对我没有用。对我有用的是完全禁用UITapGestureRecognizer,默认情况下,它包含在MKMapView中。

- (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];
}

希望这有助于其他人。

干杯!

答案 2 :(得分:0)

我有类似的问题,但反过来说。

根据所选的引脚,表格将滚动到相应的单元格。如果没有选择引脚,表将滚动回第一个单元格。当选择另一个引脚并且表不会根据需要滚动时,在调用select方法的同时调用deselect方法。

以下代码解决了这个问题,并对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];
    }}

答案 3 :(得分:0)

安娜的精彩回答。 这里是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)
    }
}

答案 4 :(得分:0)

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

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

返回NO,它有效