检查mapView是否已包含注释

时间:2013-02-28 11:56:42

标签: objective-c xcode annotations mkmapview mkannotationview

当我点击另一个注释(ann1)时,我有一种添加辅助附近注释(ann2)的方法。但是当我取消选择并重新选择完全相同的注释(ann1)时,ann2会重新创建它并再次添加。有没有办法检查地图上是否已存在注释,如果是,则不执行任何操作,否则添加新注释。我已经检查了这个:Restrict Duplicate Annotation on MapView但它没有帮助我..任何建议都表示赞赏。这就是我到目前为止所做的:

    fixedLocationsPin *pin = [[fixedLocationsPin alloc] init];
        pin.title = [NSString stringWithFormat:@"%@",nearestPlace];
        pin.subtitle = pinSubtitle;
        pin.coordinate = CLLocationCoordinate2DMake(newObject.lat, newObject.lon);

        for (fixedLocationsPin *pins in mapView.annotations) {
            if (MKMapRectContainsPoint(mapView.visibleMapRect, MKMapPointForCoordinate (pins.coordinate))) {
                NSLog(@"already in map");
            }else{
                [mapView addAnnotation:pin];
            }

在这种情况下,我已经在地图上获取了日志,但我也获得了添加到地图的注释的拖放动画。有什么想法吗?

提前谢谢..

5 个答案:

答案 0 :(得分:3)

您的for循环没有检查注释是否在屏幕上,它正在检查引脚的坐标当前是否在可见区域内。即使它正在检查pin对象是否已经在mapView.annotations中,它永远不会是真的,因为你之前刚刚创建了pin几行,它不可能与mapView.annotations中的对象相同。它可能具有相同的坐标和标题,这就是您需要检查的内容:

bool found = false;
for (fixedLocationsPin *existingPin in mapView.annotations)
{
  if (([existingPin.title isEqualToString:pin.title] && 
       (existingPin.coordinate.latitude == pin.coordinate.latitude)
       (existingPin.coordinate.longitude == pin.coordinate.longitude))
  { 
    NSLog(@"already in map");
    found = true;
    break;
  }
}    
if (!found)
{
    [mapView addAnnotation:pin];
} 

答案 1 :(得分:1)

地图对象中存在

注释数组,因此您只需检查

if ( yourmap.annotations.count==0)
{
NSLog(@"no annotations");
}

答案 2 :(得分:0)

NSNumber *latCord = [row valueForKey:@"latitude"];
NSNumber *longCord = [row valueForKey:@"longitude"];
NSString *title = [row valueForKey:@"name"];

CLLocationCoordinate2D coord;
coord.latitude = latCord.doubleValue;
coord.longitude = longCord.doubleValue;
MapAnnotation *annotation = [[MapAnnotation alloc]initWithCoordinate:coord withTitle:title];
if([mkMapView.annotations containsObject:annotation]==YES){
    //add codes here if the map contains the annotation.
}else {
    //add codes here if the annotation does not exist in the map.
}

答案 3 :(得分:0)

        if (sampleMapView.annotations.count > 0) {             
            sampleMapView.removeAnnotation(detailMapView.annotations.last!)
        }

答案 4 :(得分:-1)

在我对Craig的回答发表评论后,我认为解决方案看起来像这样:

import MapKit

extension MKMapView {

    func containsAnnotation(annotation: MKAnnotation) -> Bool {

        if let existingAnnotations = self.annotations as? [MKAnnotation] {
            for existingAnnotation in existingAnnotations {
                if existingAnnotation.title == annotation.title
                && existingAnnotation.coordinate.latitude == annotation.coordinate.latitude
                && existingAnnotation.coordinate.longitude == annotation.coordinate.longitude {
                  return true
                }
            }
        }
        return false
    }
}

此代码允许您检查mapView是否包含给定的注释。在所有注释的“for”循环中使用它:

for annotation in annotations {
  if mapView.containsAnnotation(annotation) {
    // do nothing
  } else {
    mapView.addAnnotation(annotation)
  }

PS:如果你需要添加新的注释到mapView,这种方法很有效。但是,如果您还需要删除条目,则可能必须执行相反操作:检查新注释数组中是否存在每个现有注释;如果没有,删除它。 或者您可以删除所有内容并再次添加所有内容(但随后您将更改动画...)