检测在MKMapView中select了第二个注释

当一个用户在地图上select一个注释时,我会显示一个带有信息的底部视图,例如google地图应用。 我在地图的代表中显示它:

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

当用户取消select(通过在地图上的任何地方粘贴),我隐藏我的底部视图。 这是在相反的委托方法中完成的:

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

它运作良好,我很高兴。 但是,如果用户select第二个注释( 即:他点击第一个注释,然后点击另一个注释,同时不先取消select注释 ),我不想隐藏底部视图然后再显示它。 我只是想改变它的信息。

但是,因为mapView:didDeselectAnnotationView: mapView:didSelectAnnotationView: 之前调用,所以我无法弄清楚如何检测上面描述的情况。

我的问题是: 如何检测到用户select了第二个注释,或者我应该如何解决这个问题

也许尝试延迟您的didDeselectAnnotationView方法来隐藏您的bottomView。 你需要存储一个引用到你上次select的注解视图。

例:

 @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; } } 

这可以通过在主队列上asynchronous执行而不增加明确的延迟来完成。

  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 *** } }