7

当我点击另一个注释(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];
            }

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

先感谢您..

4

5 回答 5

4

您的for循环不是检查注释是否在屏幕上,而是检查图钉的坐标当前是否在可见区域内。即使它正在检查pin对象是否已经在其中,mapView.annotations它也永远不会是真的,因为您之前只创建pin了几行,它不可能是与 on 相同的对象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];
} 
于 2013-02-28T20:03:44.783 回答
1
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.
}
于 2016-02-11T08:33:56.360 回答
1

地图对象中存在注释数组,因此您只需检查

if ( yourmap.annotations.count==0)
{
NSLog(@"no annotations");
}
于 2016-02-01T11:01:01.943 回答
0
        if (sampleMapView.annotations.count > 0) {             
            sampleMapView.removeAnnotation(detailMapView.annotations.last!)
        }
于 2016-07-04T07:14:33.817 回答
-1

在我对克雷格的回答发表评论之后,我认为解决方案可能看起来像这样:

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添加新注释,这很有效。但是如果您还需要删除条目,则可能必须做相反的事情:检查每个现有注释是否存在于新的注释数组中;如果没有,请将其删除。或者您可以删除所有内容并再次添加所有内容(但是您将获得动画更改...)

于 2015-08-21T21:17:57.450 回答