检测在MKMapView中选择第二个注释的时间

时间:2014-05-15 01:04:09

标签: ios objective-c annotations mkmapview

当用户在地图中选择注释时,我会显示带有信息的底部视图,例如Google地图应用。 我在地图的代表中显示它:

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view

当用户取消选择它(通过在地图上的任何位置录制)时,我会隐藏我的底部视图。这是在相反的委托方法中完成的:

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view

效果很好,我很满意。但是,如果用户选择第二个注释(即:他点击第一个注释,然后点击另一个注释,而不同时取消选择注释),我不想隐藏我的底部视图然后再次显示它。我只想改变其中的信息。

但是,由于mapView:didDeselectAnnotationView:mapView:didSelectAnnotationView:之前被称为,我无法弄清楚如何检测我上面描述的情况。

我的问题是:如何检测用户选择第二个注释?或者,我该如何以其他方式解决此问题?

2 个答案:

答案 0 :(得分:3)

这可以通过在主队列上异步执行来添加显式延迟来完成。

 var currentSelection: MKAnnotationView?
 func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
   currentSelection = view
   *** select code goes here ***
 }

 func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
   DispatchQueue.main.async { [weak self] in
     self?.delayedDeselect(view: view)
   }
 }

 func delayedDeselect(view: MKAnnotationView) {
   if currentSelection == view {
     *** deselect code goes here ***
   }
 }

答案 1 :(得分:2)

也许尝试在didDeselectAnnotationView方法中加一个延迟来隐藏你的bottomView。您需要存储对上次选择的注释视图的引用。

示例:

@interface MyViewController
{
    MKAnnotationView *lastSelectedAnnotationView;
}

@end


@implementation MyViewController

...

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
    ...

    [self updateBottomViewInfoWithAnnotationView:view];

    lastSelectedAnnotationView = view;
}

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
    // ------------------------------------------------------------------
    // perform check to hide bottomView after a delay, to give
    // didSelectAnnotationView a chance to select new annotation
    // ------------------------------------------------------------------

    [self performSelector:@selector(checkShouldHideBottomView:) withObject:view afterDelay:0.5];
}

-(void)checkShouldHideBottomView:(MKAnnotationView *)lastDeselectedAnnotationView
{
    // ----------------------------------------------------------------------
    // Only hide bottom view if user did not select a new annotation or 
    // last selected annotation is the same as the one being deselected
    // ----------------------------------------------------------------------
    if(lastSelectedAnnotationView == nil || lastDeselectedAnnotationView == lastSelectedAnnotationView)
    {
        // hide your bottom view example
        self.bottomView.alpha = 0;

        // clear lastSelectedAnnotationView reference
        lastSelectedAnnotationView = nil;
    }
}